C#
なぜCursor.Currentだけだと砂時計が出ないのか
出典: WinForms で UseWaitCursor が戻らないバグの解決法(業務SE目線) — なぜCursor.Currentだけだと砂時計が出ないのか
// ❌ダメな書き方(業務系で多い)
private void btnLoad_Click(object sender, EventArgs e)
{
Cursor.Current = Cursors.WaitCursor;
// ↓ここで数秒かかる。UIスレッドはブロック中。
var dt = new DataTable();
using (var conn = new SqlConnection(_connectionString))
using (var adapter = new SqlDataAdapter("SELECT * FROM big_table", conn))
{
adapter.Fill(dt);
}
dataGridView1.DataSource = dt;
Cursor.Current = Cursors.Default;
// ↑ここまで来て初めて表示が変わる(が、もう処理終わってるので一瞬しか出ない)
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「なぜCursor.Currentだけだと砂時計が出ないのか」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
5 件// ✅解決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
// ✅解決3: async/await + Task.Run private async void btnLoad_Click(object sender, EventArgs e) { btnLoad.Enabled = false;未収録
解決3: async/await + Task.RunでUIスレッドを解放する
#b2fa15052272
//画面全体にWaitCursorを効かせる場合 Application.UseWaitCursor = true; try {未収録
UseWaitCursorの罠—マウスがフォーム外だと効かない
#cd898c28b53e
