2017-01-30 3 views
0

おはよう。私はそこの提案を試みた、そしてそれは部分的に私の問題を解決しResetting Threading Timer if it's called a second timeC#restarting Threading.TimerでChangeが初期タイマーインスタンスを停止しない

私の質問は、この投稿への(種類の)フォローアップです。

私は4つのThreading.Timersを含むC#アプリケーションを持っています。

要約:2つのスレッドは2時間ごとに実行され、1つのスレッドは1回だけ実行され、1つのスレッドは1分ごとに実行されます。 4つのスレッドすべてがListBox(lstMonitor)に更新をポストします。 lstMonitorをクリアするボタンもあり、4つのスレッドをすべて再起動する必要があります。

public partial class FullSynchro : Form 
{ 
    public System.Threading.Timer TimerReference; 
    public bool TimerCanceled; 

    readonly TimeSpan tsTwo = new TimeSpan(2, 0, 0); 

    TimeSpan tickTwo = new TimeSpan(2, 0, 0); 
    TimeSpan tickOne = new TimeSpan(2, 0, 0); 

    readonly TimeSpan tsFour = new TimeSpan(0, 1, 0); 
    TimeSpan tickFour = new TimeSpan(0, 1, 0); 

    System.Threading.Timer thSyncTwo, thSyncOne, thSyncThree, thSyncFour; 

    public delegate void InvokeDelegate(string input); 

    FullSynchro objOne, objTwo, objThree, objFour; 
    TimerCallback tcbOne, tcbTwo, tcbThree, tcbFour; 

    public FullSynchro() 
    { 
     InitializeComponent(); 
    } 

    private void FullSynchro_Load(object sender, EventArgs e) 
    { 
     /* instantiating the class that gets called by the Timer. */ 
     objOne = new FullSynchro(); 
     tcbOne = new TimerCallback(PerformSyncOne); 

     /* instantiate the Timer object */ 
     thSyncOne = new System.Threading.Timer(tcbOne, objOne, 0, Timeout.Infinite); 
     objOne.TimerReference = thSyncOne; 

     objTwo = new FullSynchro(); 
     tcbTwo = new TimerCallback(PerformSyncTwo); 
     thSyncTwo = new System.Threading.Timer(tcbTwo, objTwo, 0, Timeout.Infinite); 
     objTwo.TimerReference = thSyncTwo; 

     /* one-time Sync */ 
     objThree = new FullSynchro(); 
     tcbThree = new TimerCallback(PerformSyncThree); 
     thSyncThree = new System.Threading.Timer(tcbThree, objThree, 0, 0); 
     objThree.TimerReference = thSyncThree; 

     objFour = new FullSynchro(); 
     tcbFour = new TimerCallback(PerformSyncFour); 
     thSyncFour = new System.Threading.Timer(tcbFour, objFour, 0, Timeout.Infinite); 
     objFour.TimerReference = thSyncFour; 
    } 

     void PerformSyncOne(object StateObj) 
     { 
      //code goes here 
     } 

     void PerformSyncTwo(object StateObj) 
     { 
      //code goes here 
     } 

     void PerformSyncThree(object StateObj) 
     { 
      //code goes here 
     } 

     void PerformSyncFour(object StateObj) 
     { 
      //code goes here 
     } 

    private void btnOverride_Click(object sender, EventArgs e) 
    { 
     if (Message.Show("Are you sure you wish to restart Sync?", this.Text) == DialogResult.Yes) 
     { 
      thSyncTwo.Change(0, 0); 

      //lstMonitor.Items.Clear(); 
      //PerformSync(); 
     } 
    } 
} 

ボタンコードが正常に機能しました。 thSyncTwo.Change()は最初からPerformSyncTwo()を実行しましたが、PerformSyncTwo()の最初のインスタンスはlstMonitorへの更新のポスティングを継続していました。

私はWaitHandleの使用について読んだことがありますが、動作させることはできません。私はDispose()を使用してみましたが、ほとんどすべてのスレッド関連のコードですが、Timerの最初のインスタンスはまだ実行中です。私は本当にそれらのタイマーの前のインスタンスを「殺す」必要があり、その後それらを "復活"させる必要があります。

だから可能ですか?あるいは私は別の種類のタイマーを使うべきですか?

+0

あなたはフォームFullSynchroを持っていますが、そのフォームの読み込みにはフォームのコピーを4つ作成します。フォームは4つずつコピーします。 – BugFinder

+0

4タイマー単一の(通常は量子化された「動作中のスレッド」の形で)使用することができ、マルチスレッドは定義により複雑になります。この方法では、同期オブジェクトは必要ありませんが、通常の状態オブジェクト(同じスレッドで変更されます)が必要です。 – Sinatr

+0

@BugFinderええ、なぜ私はそれをそのように設計したのか覚えていません。このアプリケーションは4歳以上で、正常に動作しています。スレッドを再起動するボタンは、クライアントから要求された新しい拡張機能です。私はそれらを削除して、アプリケーションが正常に動作し続けることができるかどうかを確認します。 –

答えて

0

タイマーを止めたい場合は timer.Change(Timeout.Infinite, Timeout.Infinite) タイマーを止めずにタイマーを止めます。その後、適切な値で.Change()を呼び出して、タイマーを再び開始する必要があります。

+0

私はすでにそれを試みましたが、うまくいきませんでした。スレッドの最初のインスタンスは引き続き実行されていました。 –

関連する問題