2016-06-01 8 views
0

私のアプリケーションでは、Timerの2つを使用しています。ここに宣言:タイマは停止後に起動しません

DispatcherTimer timer1 = new DispatcherTimer(); 
DispatcherTimer timer2 = new DispatcherTimer(); 
BackgroundWorker worker1 = new BackgroundWorker(); 
BackgroundWorker worker2= new BackgroundWorker(); 

私はtimer1を使用するため、ファイルの内容を確認し、別のBackgroundWorkerを実行するためのBackgroundWorkertimer2と重い方法を実行します。私はBackgroundWorkersにイベントを割り当てるこのように

worker1.DoWork += worker_DoWork; 
worker1.RunWorkerCompleted += worker_RunWorkerCompleted; 
worker1.WorkerSupportsCancellation = true; 
worker2.DoWork += worker_DoWork2; 
worker2.RunWorkerCompleted += worker_RunWorkerCompleted2; 
worker2.WorkerSupportsCancellation = true; 

timer1BackgroundWorker重方式を各15分の実行ので15 minutesの範囲を有します。 timer2の範囲は1 secondです。 timer1はすべて正常に機能しますが、timer2を追加したときに問題が発生しています。

このタイマーの前に、worker2でファイルを読み取るメソッドを開始できるようになったので、このファイルにはプロパティがあります。このプロパティが変更された場合、特別なアクティビティを実行する必要があります。ここまで問題ありません。

//This method is called by MainWindow 
public ReadFile() 
{ 
    //before this I already assigned to timer1 the tick event and start 
    timer2.Tick -= new EventHandler(Event_Tick); 
    timer2.Tick += new EventHandler(Event_Tick); 
    timer2.Interval = new TimeSpan(0, 0, 1); 
    timer2.Start(); 
} 

は、これは私がここにDoWork追加する必要はありませんtimer2

private void Event_Tick(object sender, EventArgs e) 
{ 
    if (!worker1.IsBusy) //I skip the reading, worker1 is busy 
    { 
     timer1.Stop(); //stop the first timer 
     worker2.RunWorkerAsync(); 
    } 
    else 
    { 
     Console.WriteLine("worker1 is busy!"); 
    } 
} 

に関連するTickイベントである、のちょうど解析である:私は何

は以下のとおりです。ファイル、非常に無駄な質問です。あなたは、私は再びtimer1を開始見て、再びReadFileメソッドを実行するにはどうすればよい

private void worker_RunWorkerCompleted2(object sender, RunWorkerCompletedEventArgs e) 
{ 
    timer1.Start(); 
    ReadFile(); 
} 

:タスクを完了worker2とき、私はこれをしませんでした。今度はtimer1がこの間隔に達した場合、15 minutesが合格したので、DoWorkworker1を実行するtimer1.Tick += new EventHandler(Heavy_Tick);を実行する必要があります。しかし、timer1は決して開始しません。

私には分かりませんが、私は何を間違えていますか?

+0

私はあなたの問題は、毎分実行されるこのif:!(!worker1.IsBusy){timer1.Stop(); ' によって引き起こされると思います。もし、次のチェックの前にworker1を起動しなければ、timer1は再び停止するでしょう。 – LocEngineer

+0

@LocEngineer私は 'ReadFile'を呼び出す前に' timer1'を起動しているので、私を信頼して、 timer1.Start() 'が呼び出されます。はい、私は同じですが、私は残念なことに修正プログラムを管理することはできません。 – Heisenberg

+0

'ReadFile'を呼び出すことは一つですが、' ReadFile'はバックグラウンドワーカー 'worker1'を起動しません。そして、それはビジーであることがチェックされます。 – LocEngineer

答えて

0

今すぐ取得します。 worker1が15分おきに、worker2が毎秒(worker1がビジーでない場合)にのみ実行します。あなたの問題は、ここではこれです:

if (!worker1.IsBusy) //I skip the reading, worker1 is busy 
{ 
    timer1.Stop(); //stop the first timer 
    worker2.RunWorkerAsync(); 
} 

と、この:例えば、両方のタイマー間隔を設定し、起動時にイベントハンドラをチェック

public ReadFile() 
{ 
    //before this I already assigned to timer1 the tick event and start 
    timer2.Tick -= new EventHandler(Event_Tick); 
    timer2.Tick += new EventHandler(Event_Tick); 
    timer2.Interval = new TimeSpan(0, 0, 1); 
    timer2.Start(); 
} 

Form_Load()またはMain()の冒頭にあります。それらもそこから始める。 タイマーを停止する必要はありません。 間隔を設定することによって、Tick()イベントを処理するだけで済みます。 WorkerCompletedTickの方法から.Start()Stop()の通話を削除しても問題ありません。

+0

私はStop and Startを削除してうまくいっているようですので、 '.IsBusy'だけを使用してこれらの問題をすべて解決しますか?実際にテストは大丈夫です、どんな提案ですか?ありがとうございます:) – Heisenberg

+0

正確に。 '.IsBusy'を使うだけで十分です。あなたのタイマーを全部始めると止めることで、あなたはインターバルを乱すので、不安定な振る舞いをします。 :-) – LocEngineer

+0

それはうまくいくようです。私はただ1つの質問を持っています: 'worker1'がビジー状態であることを確認した後、' worker2'を使用しているとしますが、同じ瞬間に 'worker1'は' timer1'から開始します。 'worker2'では' busy1 'を使用する必要があります。この時点でworker1がビジー状態であることを例外として生成する必要があります。あなたは私に同意しますか?そんなことがあるかもしれない?あなたは管理したいかもしれませんか? – Heisenberg

0

そう多くはここに行くことができますが、あなたはことを確認する必要があります。

  1. あなたタイマーが、それは昔の進歩だ保存されていないとあなたが停止する前に、時間の特定の長さをチェックされています。これにより、再起動時に自動的にタイマーが停止します。

  2. timer.stop()関数は、オブジェクトを再起動不可能な状態にしているわけではありません。

  3. タイマー変数には、停止した値を維持するポインタを使用してアクセスしていません。私は個人的にちょうどこれが問題を引き起こしているので、それを止める完全にタイマーを一時停止し、進捗状況をリセットし、代わりに検討したい

(それが起こるとき、思いも寄らないしかし、迷惑な)。

+0

答えに感謝します。 'worker_RunWorkerCompleted2'イベントの' timer1.Start() 'と' 15分 'が正しく表示されているので、' .Stop'を呼び出すとオブジェクトが破棄されないと思います。すべてのイベントが割り当てられます。とにかく、私は '.Pause'メソッドを見つけることができません。私はウェブ上で多くを検索し、何も見つかりませんでした。 – Heisenberg

関連する問題