2011-08-10 11 views
0

私は、タイマー(System.Timers.Timer)でそれを実行している間、遅い方法を持っています。タイマーのタイムアウトよりも実行に時間がかかることがあり、タイマーが待機します。私は30ms後に例えば30ms後にタイマーを設定したいが、待たずにメソッドをリセットしたい。どんなタイマーを使うべきですか?タイムアウトでタイマーを作成する方法

EDIT:

void OnTimerElapsed() { 
     SomeMethod(args1); 
     SomeMethod(args2); 
     SomeMethod(args3); 
} 

のsomeMethodが別のアセンブリ内に配置されています。これは、別のアプリケーションからデータを要求する同期メソッドです。なぜ時々それがハングアップするのかわかりません。これにより、SomeMethod()が続行されるまで、タイマーが一時停止します。

+1

"メソッドをリセットする"とはどういう意味ですか?確かにあなたはスレッドについて話しているわけではありません。 –

+0

はい、タイマーのタイムアウト後に操作を中止します。 – blez

+0

FWIWスレッドを中止することは非常に悪い習慣と考えられます。可能性のある不良状態から回復する方法やリソースなどを処分する方法がわからないからです。 – drharris

答えて

1

System.Timers.Timerを使用し、そのAutoResetをfalseに設定し、前回の経過時間またはカスタム条件でのみ起動します。

private System.Timers.Timer _timer = new System.Timers.Timer(); 
private volatile bool _requestStop = false; 

private void InitializeTimer() 
{ 
    _timer.Interval = 100; 
    _timer.Elapced += OnTimerElapced; 
    _timer.AutoReset = false; 
    _timer.Start(); 
} 

private void OnTimerElapced(object sender, System.Timers.TimerEventArgs e) 
{ 
    //_timer.Stop();//if AutoReset was not false 

    //do work.... 

    if (!_requestStop) 
    { 
     _timer.Start();//restart the timer 
    } 
} 

private void Stop() 
{ 
    _requestStop = true; 
    _timer.Stop(); 
} 

private void Start() 
{ 
    _requestStop = false; 
    _timer.Start(); 
} 

編集:あなたが好きなら時計タイマーに、操作がより長い時間がかかる場合は、最初の場所でタイマーを使うべきではありません、代わりにあなたを包む使用ここで私が使用パターンがあります新しいスレッドで操作してMaunalResetEventを使用している場合は、そのWaitOneメソッドを使用してタイムアウトを指定し、タイムアウトが発生した場合は停止します。

+0

System.Timers.Timerを使用すると、OPの問題が著しく悪化し、OnTimerElapsedを実行する複数のスレッドが発生します。ものすごく悪い。 –

+0

でもいいですが、 "うまくいく"には時間がかかりますが、requestStopを確認するまでハングアップします。 – blez

+0

@blez回答を編集して代替ソリューションを指定しました。 –

関連する問題