動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

Control.Invokeでクロススレッド例外を回避する

出典: WinForms Timer 3兄弟の使い分け — System.Windows.Forms.Timer / System.Threading.Timer / System.Timers.TimerControl.Invokeでクロススレッド例外を回避する

Control.Invokeでクロススレッド例外を回避する (csharp)#bec87b013e86
// ✅パターン4: Control.Invokeでクロススレッド回避
public partial class MyForm : Form
{
    //ヘルパー: UIスレッドでアクションを実行
    private void RunOnUiThread(Action action)
    {
        if (this.IsDisposed || !this.IsHandleCreated)return;
 
        if (this.InvokeRequired)
        {
            this.BeginInvoke(action);   //非同期マーシャリング(呼び出し元はブロックしない)
        }
        else
        {
            action();   //既にUIスレッドならそのまま実行
        }
    }
 
    private void BackgroundCallback(object state)
    {
        //別スレッドで動く処理
        var newData = FetchFromApi();
 
        // UI更新はRunOnUiThreadでマーシャリング
        RunOnUiThread(()=>
        {
            dataGridView1.DataSource = newData;
            labelCount.Text = $"件数: {newData.Count}";
        });
    }
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
  • id: #bec87b013e86
  • lines: 31
  • extracted: 2026-06-10

Source収録記事

この snippet は記事の「Control.Invokeでクロススレッド例外を回避する」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

4
図鑑トップ