すこし。まず、次の MSDN ページをチェックしてくださいSystem.Timers.Timer
: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
あなたが懸念する必要があるセクションは以下に引用されています:
SynchronizingObject プロパティが null の場合、ThreadPool スレッドで Elapsed イベントが発生します。Elapsed イベントの処理が Interval より長く続く場合、イベントは別の ThreadPool スレッドで再び発生する可能性があります。この場合、イベント ハンドラーは再入可能にする必要があります。
基本的に、これはTimer
のアクションが実行される場所で、それぞれTimer
が独自のスレッドを持つのではなく、デフォルトでシステムを使用しThreadPool
てアクションを実行することを意味します。
物事を同時に実行したい (すべて同時に開始する) が同時に実行したい場合は、複数のイベントを経過イベントに置くことはできません。たとえば、VS2012でこれを試しました:
static void testMethod(string[] args)
{
System.Timers.Timer mytimer = new System.Timers.Timer();
mytimer.AutoReset = false;
mytimer.Interval = 3000;
mytimer.Elapsed += (x, y) => {
Console.WriteLine("First lambda. Sleeping 3 seconds");
System.Threading.Thread.Sleep(3000);
Console.WriteLine("After sleep");
};
mytimer.Elapsed += (x, y) => { Console.WriteLine("second lambda"); };
mytimer.Start();
Console.WriteLine("Press any key to go to end of method");
Console.ReadKey();
}
出力は次のとおりです。
メソッドの最後に移動するには、任意のキーを押します
最初のラムダ。
睡眠 3 秒
睡眠後
2 番目のラムダ
したがって、それらは同時にではなく連続して実行されます。Elapsed
したがって、タイマーの実行ごとに「一連のことが起こる」ようにする場合は、ハンドラーで一連のタスクを起動する (またはアクションを含む ThreadPool をキューに入れる) 必要があります。それらをマルチスレッド化する場合とそうでない場合がありますが、私の単純な例ではそうではありませんでした。
私のコードを自分で試してみてください。何が起こっているのかを説明するのは非常に簡単です。