C#
Control.Invokeでクロススレッド例外を回避する
出典: WinForms Timer 3兄弟の使い分け — System.Windows.Forms.Timer / System.Threading.Timer / System.Timers.Timer — Control.Invokeでクロススレッド例外を回避する
// ✅パターン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 は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「Control.Invokeでクロススレッド例外を回避する」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ✅パターン1: System.Windows.Forms.Timer(UI更新の本命) using System.Windows.Forms; public partial class MainForm : Form未収録
System.Windows.Forms.Timer — UIスレッド発火の本命
#c9ab3217e3d2
// ✅パターン2: System.Threading.Timer(バックグラウンド計算) using System.Threading; public partial class LogMonitorForm : Form未収録
System.Threading.Timer —スレッドプール発火の軽量版
#db033bd6db6b
// ✅パターン3: System.Timers.Timer + SynchronizingObject(コンポーネント風) using System.Timers; public partial class DashboardForm : Form未収録
System.Timers.Timer + SynchronizingObject —コンポーネント風
#808a82d2d659
// ✅パターン5:再入禁止フラグでTick重複を防ぐ public partial class HeavyTaskForm : Form { private System.Timers.Timer _timer;未収録
再入禁止フラグでTick重複を防ぐ
#94e84408937b
