2012-04-28 3 views
0

私自身のコードでThread.TimersのMSDNの例(http://msdn.microsoft.com/en-us/library/swx5easy.aspx)を実装しようとしています。スレッドタイマーを別のクラスから取り消す

特定のユーザーアクションが実行されたときにタイマーを取り消すことができますが、タイマーを破棄することはできません。別のクラスのメソッドを呼び出して調整する必要があるためです。私はどこが分からないのですか?

これ以外の場合、タイマーは正常に動作します。 btnconfigOpenConfigが呼び出されたときに私のタイマーがキャンセルされない理由を誰でも見ることができますか?

FYI私はワーカープロセスをタイムドイベントに変換しています。

public partial class Xservt : Window 
     { 

      internal class TimerStateObjClass 
      { 
       public int SomeValue; 
       public System.Threading.Timer SqlUpdateFromTwitterTimerReference; 
       public bool TimerCanceled; 
      } 


internal void SomeMethod(){ 


        TimerStateObjClass stateObj = new TimerStateObjClass(); 
        stateObj.TimerCanceled = false; 
        stateObj.SomeValue = 100; 
        System.Threading.TimerCallback timerDelegate = 
         new System.Threading.TimerCallback(twit.hometimelineclass._sqlUpdateFromTwitterWorker_DoWork); 

        var sqlUpdateFromTwitterTimer = new Timer(timerDelegate, stateObj, 0,20000); 
        stateObj.SqlUpdateFromTwitterTimerReference = sqlUpdateFromTwitterTimer; 

    } 
} 


//action to perform which disposes the timer 
private void btnconfigOpenConfig(object sender, RoutedEventArgs e) 
      { 

       TimerStateObjClass timerState = new TimerStateObjClass(); 
       timerState.TimerCanceled = true; 
    } 


//Actions the timer is calling, in another class 
internal static void _sqlUpdateFromTwitterWorker_DoWork(object StateObj) 
      { 

       Xservt.TimerStateObjClass state = (Xservt.TimerStateObjClass) StateObj; 

       if(state.TimerCanceled) 
       { 
        state.SqlUpdateFromTwitterTimerReference.Dispose(); 

       } 

    //some work 
    } 
+3

TimerStateObjClassの* new *オブジェクトを作成しています。それがうまくいかない場合は、クラスにプライベートフィールドを追加してください。 –

+0

からTimerStateObjClass? TimerStateObjClassタイプの – Damo

+0

、はい。 –

答えて

0

ハンスはコメントで指摘したように、あなたが最初に作成TimerStateObjClassへの参照を保持する必要があります。それを使ってTimerCanceledを設定することができます。

public partial class Xservt : Window 
{ 

    internal class TimerStateObjClass 
    { 
     public int SomeValue; 
     public System.Threading.Timer SqlUpdateFromTwitterTimerReference; 
     public bool TimerCanceled; 
    } 

    TimerStateObjClass stateObj; //THIS IS THE ORIGINAL STATE OBJ 
    internal void SomeMethod() 
    { 
     stateObj = new TimerStateObjClass(); 
     stateObj.TimerCanceled = false; 
     stateObj.SomeValue = 100; 
     System.Threading.TimerCallback timerDelegate = new System.Threading.TimerCallback(twit.hometimelineclass._sqlUpdateFromTwitterWorker_DoWork); 

     var sqlUpdateFromTwitterTimer = new Timer(timerDelegate, stateObj, 0, 20000); 
     stateObj.SqlUpdateFromTwitterTimerReference = sqlUpdateFromTwitterTimer; 
    } 

    //action to perform which disposes the timer 
    private void btnconfigOpenConfig(object sender, RoutedEventArgs e) 
    { 
     //HERE WE CAN GET AT THE ORIGINAL STATE OBJ 
     stateObj.TimerCanceled = true; 
    } 
} 
    //Actions the timer is calling, in another class 
    internal static void _sqlUpdateFromTwitterWorker_DoWork(object StateObj) 
    { 
     Xservt.TimerStateObjClass state = (Xservt.TimerStateObjClass)StateObj; 

     if (state.TimerCanceled) 
     { 
      state.SqlUpdateFromTwitterTimerReference.Dispose(); 
     } 

     //some work 
    } 
0
  1. あなたはあなたのクラスのどこか(タイマーを参照するか、クラス)あなたのタイマーへの参照を格納する必要があります。
  2. タイマーを停止するには、それを処分する必要はありません。 timer.Change(-1, -1);に電話することができます。それは何かそのようにする必要がありtimer.Change(dueTimeInMs, intervalInMs);

あなたのコードを呼び出すことによって、再びタイマーを再度有効にすることができます:

public partial class Xservt : Window 
{ 
    private Timer timer = new Timer(o => DoSomething()); 

    private void StartTimer() 
    { 
    var period = 5 * 1000; // 5 sec 
    timer.Change(0, period); 
    } 

    private void StopTimer() 
    { 
    timer.Change(-1, -1); 
    } 
} 

そして、それを実行するためにStartTimerを呼び出し、StopTimerをそれぞれ停止します。

DoSomethingがタイマ間隔よりも長く実行され、そのメソッドが複数のスレッドで同時に実行される可能性がある場合にも注意してください。代わりにdueTimeをタイマーの間隔を使用しますが、使用しないことを避けるために:このタイマーで

private Timer timer = new Timer(o => { 
             DoSomething(); 
             StartTimer(); 
             }); 

    private void StartTimer() 
    { 
    var period = 5 * 1000; // 5 sec 
    timer.Change(period, 0); 
    } 

は、一度だけ実行するようにtrigreredされているが、それぞれが実行した後に、それは再トリガされます。

関連する問題