1. はじめに
- C#のTimerのコールバック処理に時間がかかる時に処理が並行しないようにしたい
2. 開発環境
- C#
- .NET 6
- Visual Studio 2022
3. 変更前のソース
public class Sample : IExecutable
{
public void Execute()
{
var timer = new System.Threading.Timer(TimerCallback);
timer.Change(0, 1000);
Thread.Sleep(10000);
}
void TimerCallback(object state)
{
// 時間がかかるコールバック処理
Thread.Sleep(9000);
}
}
4. 変更後のソース
public class Sample : IExecutable
{
public void Execute()
{
var timer = new System.Threading.Timer(TimerCallback);
// 呼び出し間隔をセットしない
timer.Change(0, Timeout.Infinite);
Thread.Sleep(10000);
}
void TimerCallback(object state)
{
// 時間がかかるコールバック処理
Thread.Sleep(9000);
// コールバック処理後に再度呼び出し間隔をセットする
var timer = state as System.Threading.Timer;
timer.Change(1000, Timeout.Infinite);
}
}
5. 参考文献