C#
再入禁止フラグでTick重複を防ぐ
出典: WinForms Timer 3兄弟の使い分け — System.Windows.Forms.Timer / System.Threading.Timer / System.Timers.Timer — 再入禁止フラグでTick重複を防ぐ
// ✅パターン5:再入禁止フラグでTick重複を防ぐ
public partial class HeavyTaskForm : Form
{
private System.Timers.Timer _timer;
private int _busyFlag = 0; // 0=空き/ 1=実行中
public HeavyTaskForm()
{
InitializeComponent();
_timer = new System.Timers.Timer(1000){ AutoReset = true };
_timer.Elapsed += Timer_Elapsed;
_timer.Start();
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
//既に実行中なら今回のTickはスキップ(再入禁止)
if (Interlocked.CompareExchange(ref _busyFlag, 1, 0)!= 0)return;
try
{
DoHeavyTask(); // 1秒以上かかる重い処理
}
finally
{
Interlocked.Exchange(ref _busyFlag, 0); //確実にフラグを戻す
}
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「再入禁止フラグでTick重複を防ぐ」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
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
// ✅パターン4: Control.Invokeでクロススレッド回避 public partial class MyForm : Form { //ヘルパー: UIスレッドでアクションを実行未収録
Control.Invokeでクロススレッド例外を回避する
#bec87b013e86
