C#
定石3: async-await + Task.Run —新規プロジェクトの本命
出典: WinForms 非同期処理の正解 — BackgroundWorker / Task.Run / async-await の使い分け — 定石3: async-await + Task.Run —新規プロジェクトの本命
// ✅定石3: async-await + Task.Run(新規プロジェクトの本命)
using System.Threading.Tasks;
public partial class ImportForm : Form
{
private async void btnStart_Click(object sender, EventArgs e)
{
btnStart.Enabled = false;
try
{
//バックグラウンドで重い処理
string result = await Task.Run(()=> DoHeavyWork());
// ↓ここはUIスレッドに自動復帰している(Invoke不要)
lblStatus.Text = "完了";
txtResult.Text = result;
}
catch (Exception ex)
{
MessageBox.Show($"エラー: {ex.Message}");
}
finally
{
btnStart.Enabled = true;
}
}
private string DoHeavyWork()
{
//バックグラウンドスレッドで動く処理
Thread.Sleep(3000);
return "5万件処理完了";
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「定石3: async-await + Task.Run —新規プロジェクトの本命」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
5 件// ✅定石1: BackgroundWorkerでファイル取り込み using System.ComponentModel; public partial class ImportForm : Form未収録
定石1: BackgroundWorker —旧式だがDesigner配置できる
#b0579a8291a4
// ✅定石2: Task.Run + Control.Invoke using System.Threading.Tasks; public partial class ImportForm : Form未収録
定石2: Task.Run + Control.Invokeでモダンに書く
#e29c62a2a0b1
// ✅定石4: IProgress<T>で進捗報告(async-await版BackgroundWorker.ReportProgress) using System; using System.Threading.Tasks;未収録
定石4: IProgressで進捗をUIに細かく反映
#fa2904c0a651
// ✅定石5: CancellationTokenでキャンセル可能 using System.Threading; using System.Threading.Tasks;未収録
定石5: CancellationTokenでキャンセル可能にする
#298c9a3462f2
// ❌ NG: UIスレッドでWait()/ Resultを呼ぶとデッドロック private void btnStart_Click(object sender, EventArgs e) { var result = Task.Run(()=> DoHeavyWork()).Result; // ← UIスレッド固まる未収録
定石6: Wait()/ Resultでデッドロック—業務系の禁忌パターン
#8f703fd10c73
