Timerを使っていろいろやってみたんですが
サンプルコード
マイクロソフトの公式サイトのサンプルコードを参考に作成しました。
※あくまでも使用例のイメージなのでコンパイルは通していません。コンパイルエラー出たらごめんなさい。
https://learn.microsoft.com/ja-jp/dotnet/api/system.timers.timer?view=net-8.0
サンプルコード
Timer2.cs
using System;
using System.Timers;
using System.Threading;
// Timer 自体は System.Threading にも存在するので明示しておく
using Timer = System.Timers.Timer;
public class Example
{
private static Timer aTimer = null!;
private static bool IsTimer = false;
public static void Main()
{
SetTimer();
aTimer.Enabled = true; //タイマー開始
IsTimer = true;
while (IsTimer)
{
//最適化でwhile処理が省略されてしまうのを防ぐ
//Sleepを使っているが、UIが固まることがないのでおすすめ
Thread.Sleep(1);
}
//2000ms経過したらループを抜けて以下の処理をする
IsTimer = false;
aTimer.Enabled = false;
Console.WriteLine("終了");
}
private static void SetTimer()
{
// Create a timer with a two second interval.
//aTimer.Intervalで時間指定もできる
aTimer = new Timer(2000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = false; //タイマーを繰り返すか否か
aTimer.Enabled = false;
}
//タイマーでセットした時間が経過したらこのイベントが呼ばれる
private static void OnTimedEvent(object? source, ElapsedEventArgs e)
{
IsTimer = false;
aTimer.Enabled = false;
}
}
別スレッドの処理が終わるまで待ちたいときもこれが使える。
他のスレッドの処理内で、処理が終わったらIsTimerフラグをfalseにしてあげればよいかなと思う。
何かしらの原因で無限ループになってフリーズしないためにもタイマーでタイムアウト処理は各必要がある。