2011-12-05 27 views
2

タイマーあたり1つのスレッドがある場合は、例えば1 System.Timers.Timer = 1スレッド?

class MyObj 
{ 
    private Timer _timer; 

    public MyObj() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     _timer = new Timer(2000); 
     _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); 
     _timer.Start(); 
    } 

    void _timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     Console.WriteLine("MyObj !"); 
    } 


} 
class Program 
{ 
    private static Timer _timer; 

    private static void Main(string[] args) 
    { 
     _timer = new Timer(500); 
     _timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); 
     _timer.Start(); 
     MyObj mo = new MyObj(); 
     Console.Read(); 
    } 

    static void _timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     Console.WriteLine("Program !"); 
    } 
} 

は、2件のスレッドがありますか?

+0

関連:http://stackoverflow.com/q/1435876/158779 –

答えて

4

タイマーはThreadPoolを使用していますので、たいていは2つのスレッドを使用しています。しかし、ThreadPoolのスレッドがリサイクルされると、同じスレッドを2回、または2つのスレッドで同時に使用することはできません。

タイマー自体はスレッドを作成しません。

また、タイマーが刻々と変化しない場合、ThreadPoolには何の仕事も投稿されません。したがって、本質的にはどのスレッドにも「コストがかかる」ことはありません。

ティックスレッドは不確定です...タイマーを作成するスレッドはではなく、のスレッドが発生します。あなたのティック内のロジックは、それがクラス内の他のものと並行して実行されている可能性があることを認識する必要があります。

3

いいえタイマーごとに予約されたスレッドはありません。イベントはスレッドプールスレッドでスケジュールされ、タイマーはイベントハンドラーが実行されていない間はスレッドをブロックしません。複数のスレッドプールスレッドが存在するため、イベントハンドラはスレッドセーフである必要があります。

ドキュメントの状態:

SynchronizingObjectプロパティがNothingある場合は、ElapsedイベントはThreadPoolのスレッド上で発生します。 Elapsedイベントの処理がIntervalより長く続く場合、イベントは別のThreadPoolスレッドで再度発生する可能性があります。この状況では、イベントハンドラはリエントラントである必要があります。

関連する問題