C#
System.Threading.Timer —スレッドプール発火の軽量版
出典: WinForms Timer 3兄弟の使い分け — System.Windows.Forms.Timer / System.Threading.Timer / System.Timers.Timer — System.Threading.Timer —スレッドプール発火の軽量版
// ✅パターン2: System.Threading.Timer(バックグラウンド計算)
using System.Threading;
public partial class LogMonitorForm : Form
{
private System.Threading.Timer _bgTimer;
private int _processedCount = 0;
public LogMonitorForm()
{
InitializeComponent();
// dueTime=0(即座に開始)/ period=5000(5秒ごと)
_bgTimer = new System.Threading.Timer(BackgroundCheck, null, 0, 5000);
}
private void BackgroundCheck(object state)
{
//ここはスレッドプール上で動く→ UIコントロールを直接触ると例外
var newLogs = LogReader.PollNewEntries();
_processedCount += newLogs.Count;
// UI更新はControl.InvokeでUIスレッドにマーシャリング(次のセクション参照)
if (this.IsHandleCreated && !this.IsDisposed)
{
this.BeginInvoke(new Action(()=>
{
labelStatus.Text = $"処理済: {_processedCount}件";
}));
}
}
private void LogMonitorForm_FormClosing(object sender, FormClosingEventArgs e)
{
_bgTimer?.Dispose(); // Threading.TimerはStopメソッドがない、Disposeで停止
}
}
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です
Source収録記事
この snippet は記事の「System.Threading.Timer —スレッドプール発火の軽量版」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
4 件// ✅パターン1: System.Windows.Forms.Timer(UI更新の本命) using System.Windows.Forms; public partial class MainForm : Form未収録
System.Windows.Forms.Timer — UIスレッド発火の本命
#c9ab3217e3d2
// ✅パターン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
// ✅パターン5:再入禁止フラグでTick重複を防ぐ public partial class HeavyTaskForm : Form { private System.Timers.Timer _timer;未収録
再入禁止フラグでTick重複を防ぐ
#94e84408937b
