経過イベントがいつ発生するかを理解しようとしていますがSystem.Timers.Timer
、それは独立したスレッドで発生するのでしょうか?
以下の例では、3 つのタイマーがそれぞれのスレッドで独立して実行されていることが示唆されています。
class Program
{
static System.Timers.Timer timer = new System.Timers.Timer();
static System.Timers.Timer timer2 = new System.Timers.Timer();
static System.Timers.Timer timer3 = new System.Timers.Timer();
static void Main(string[] args)
{
timer.Elapsed += new System.Timers.ElapsedEventHandler(
timer_Elapsed);
timer2.Elapsed += new System.Timers.ElapsedEventHandler(
timer2_Elapsed);
timer3.Elapsed += new System.Timers.ElapsedEventHandler(
timer3_Elapsed);
timer.Interval = 1000;
timer2.Interval = 1000;
timer3.Interval = 1000;
timer.Start();
timer2.Start();
timer3.Start();
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
static void timer3_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer3.Stop();
Console.WriteLine("Timer 3 Hit...");
timer3.Start();
}
static void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer2.Stop();
Console.WriteLine("Timer 2 Hit...");
Thread.Sleep(2000);
timer2.Start();
}
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Stop();
Console.WriteLine("Timer 1 Hit...");
Thread.Sleep(10000);
timer.Start();
}
}
ベストアンサー1
MSDN によれば、イベントが発生すると、System.Timers.Timer
システムElapsed
スレッド プール内のスレッドで呼び出されます。
SynchronizingObject プロパティが Nothing の場合、ThreadPool スレッドで Elapsed イベントが発生します。Elapsed イベントの処理が Interval より長く続くと、別の ThreadPool スレッドでイベントが再度発生する可能性があります。このような状況では、イベント ハンドラーは再入可能である必要があります。
のデフォルト値はSynchronizingObject
null なので、経過イベントはすべてスレッド プールで処理されます。したがって、スレッド プールの空き状況によって異なりますが、空きスレッドがある場合は、各経過イベントは別々のスレッドで同時に実行される可能性が高くなります。ただし、何らかの理由でシステム スレッド プールがすでに完全に使用されている場合は、経過イベントがスケジュールどおりにシリアル化される可能性があります。
重要な点は、「状況によって異なる」ということです。つまり、プール内に空きスレッドがある限り、並列実行が許可されます。