2010-12-16 5 views
7

System.Threading.Timerを使用すると、タイマーを作成したスレッドでメソッドが実行されますか?または別のスレッドで実行されていますか?タイマーデリゲート(CheckStatus)によって呼び出されるメソッドは、メインスレッドで実行されるか、別のスレッドで実行されている場合System.Threading.Timer

class Timer 
{ 
    static void Main() 
    { 
     TimerCallback tcall = statusChecker.CheckStatus; 
     Timer stateTimer = new Timer(tcb, autoEvent, 1000, 250); 
    } 
} 
class StatusChecker 
{ 
    public void CheckStatus(Object stateInfo) 
    { 
    } 
} 

私の質問はありますか?

+0

コードを投稿できますか? – Oded

+0

ここで尋ねようとしていることは、あいまいです。質問を明確にするためにコードを投稿してください。 –

答えて

6

System.Threading.Timerは、スレッドプール内の別のスレッドでその作業を実行します。

System.Windows.Forms.Timerは、既存の(GUI)スレッドで実行されます。

+1

また注意しなければならないのは、 'System.Windows.Forms.Timer'はアクティブなフォームがない場合(コンソールアプリケーションのような)、スレッドプールスレッドに戻ります。また、スレッドがアイドル状態(イベントハンドラが実行されていない状態)になるとメソッドが実行されます。しかし、あなたはイベントハンドラでは、とにかく時間を費やしているわけではありません。 :) –

+0

@Vilx - 私はそれを知りませんでしたので、私の答えに追加のコメントに感謝:) –

+0

実際に...私はそれを取り戻す。それは元に戻らない。 Windowsフォームでのみ使用できます。しかし、私はかつて(あまりにもずっと前に)Windowsフォームやスレッドプールスレッドの中から選んだ標準のタイマーの1つを見たことは確かです。 :( –

2

ドキュメントは、次の言う:

それはThreadPoolのスレッドで呼び出されるため、コールバックのために指定された方法は、リエントラントでなければなりません。

したがって、コールバックはほぼ確実に別のスレッドにあります。

もちろん、ThreadPoolスレッドからタイマーを起動すると、同じスレッドで実行される可能性はありますが、保証はありません。

2

MSDN国:

あなたはTimerを実行する方法を指定するTimerCallbackデリゲートを使用してください。タイマーデリゲートは、タイマーの作成時に指定され、変更できません。このメソッドは、タイマーを作成したスレッドでは実行されません。システムによって提供されたThreadPoolスレッドで実行されます。したがって

、あなたの例では、タイマーデリゲート(CheckStatus)は別々のスレッドで実行されます。

関連する問題