C#
定石6: Wait()/ Resultでデッドロック—業務系の禁忌パターン
出典: WinForms 非同期処理の正解 — BackgroundWorker / Task.Run / async-await の使い分け — 定石6: Wait()/ Resultでデッドロック—業務系の禁忌パターン
// ❌ NG: UIスレッドでWait()/ Resultを呼ぶとデッドロック
private void btnStart_Click(object sender, EventArgs e)
{
var result = Task.Run(()=> DoHeavyWork()).Result; // ← UIスレッド固まる
// ...
}
// ✅ OK: awaitで書き直す(UIスレッド解放される)
private async void btnStart_Click(object sender, EventArgs e)
{
var result = await Task.Run(()=> DoHeavyWork());
// ...
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石6: Wait()/ Resultでデッドロック—業務系の禁忌パターン」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
5 件// ✅定石1: BackgroundWorkerでファイル取り込み using System.ComponentModel; public partial class ImportForm : Form未収録
定石1: BackgroundWorker —旧式だがDesigner配置できる
#df48c972d049
// ✅定石2: Task.Run + Control.Invoke using System.Threading.Tasks; public partial class ImportForm : Form未収録
定石2: Task.Run + Control.Invokeでモダンに書く
#17558f5f8cdc
// ✅定石3: async-await + Task.Run(新規プロジェクトの本命) using System.Threading.Tasks; public partial class ImportForm : Form未収録
定石3: async-await + Task.Run —新規プロジェクトの本命
#08f2e9eba268
// ✅定石4: IProgress<T>で進捗報告(async-await版BackgroundWorker.ReportProgress) using System; using System.Threading.Tasks;未収録
定石4: IProgressで進捗をUIに細かく反映
#8291000709ca
// ✅定石5: CancellationTokenでキャンセル可能 using System.Threading; using System.Threading.Tasks;未収録
定石5: CancellationTokenでキャンセル可能にする
#cdf2b4fdbd67
