C#
解決3: async/await + Task.RunでUIスレッドを解放する
出典: WinForms で UseWaitCursor が戻らないバグの解決法(業務SE目線) — 解決3: async/await + Task.RunでUIスレッドを解放する
// ✅解決3: async/await + Task.Run
private async void btnLoad_Click(object sender, EventArgs e)
{
btnLoad.Enabled = false;
using (new WaitCursorScope(this))
{
var dt = await Task.Run(()=>
{
var t = new DataTable();
using (var conn = new SqlConnection(_connectionString))
using (var adapter = new SqlDataAdapter("SELECT * FROM big_table", conn))
{
adapter.Fill(t);
}
return t;
});
dataGridView1.DataSource = dt;
}
btnLoad.Enabled = true;
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「解決3: async/await + Task.RunでUIスレッドを解放する」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
5 件// ❌ダメな書き方(業務系で多い) private void btnLoad_Click(object sender, EventArgs e) { Cursor.Current = Cursors.WaitCursor;未収録
なぜCursor.Currentだけだと砂時計が出ないのか
#664c8dc93713
// ✅解決1: try-finally + UseWaitCursor private void btnLoad_Click(object sender, EventArgs e) { this.UseWaitCursor = true;未収録
解決1: try-finallyで確実に戻す(同期処理向け)
#15920e216e92
// ✅解決2-a: IDisposableラッパーの定義 public sealed class WaitCursorScope : IDisposable { private readonly Form _form;未収録
解決2: IDisposableラッパーでスコープ化する
#90f0b8a724f2
// ✅解決2-b:使用例 private void btnLoad_Click(object sender, EventArgs e) { using (new WaitCursorScope(this))未収録
解決2: IDisposableラッパーでスコープ化する
#d1e30ad15372
//画面全体にWaitCursorを効かせる場合 Application.UseWaitCursor = true; try {未収録
UseWaitCursorの罠—マウスがフォーム外だと効かない
#cd898c28b53e
