2016-07-22 6 views
-1

私のWPFアプリケーションは、「ブートストラップ」プロセスの早い段階でThreading.Timerを開始します。タイマー間隔は100msであり、タイマーデリゲートのコードは通常約70msかかる(一連のforループでいくつかの操作を実行しますが、そのうちのいくつかはシリアルポートからの読み取りを含みます)。タイマーを起動すると、残りのアプリケーションが初期化されます(DIフレームワークに登録されたタイプ、ビューの作成、ビューモデル、その他のさまざまな初期化関数)。これらの数秒間に、タイマー内で実行されるコードは完全に「停止」します。それは決して失敗することはなく、シリアル読み込みのどれも失敗することはありません(それは純粋に幸運ですか?)タイマーコードは約3秒間実行を一時停止するようです。なぜThreading.Timerはデリゲートを停止していますか?

私は、この(UIスレッド上の)スタートアップのすべての優先度が高くなっているため、タイマースレッドがCPU時間を取得できないと考えられます。私はそれについて何かできることはありますか?後でブートストラッププロセスでタイマーを起動することも可能ですが、最初に他のソリューションを試してみたかったのです。

Threading.Timerは "re-entrancy"(正しい用語である場合)をどのように処理しますか?つまり、以前の呼び出しがまだ実行されている間にタイマーが "tick"しますか?前の呼び出しが最終的に完了したときに次の呼び出しが「キューに入れられ」実行されますか、それとも自分で処理する必要がありますか?

答えて

1

1)タイマーは、必要に応じてすぐにタスクを起動します。キューはありません。あなたは、このようなスケジューリング何かでそれを自分でチェックすることがあります。

Console.WriteLine("Sleep"); 
Thread.Sleep(10000); 
Console.WriteLine("Awaken"); 

あなたは1秒の周期で、このようないくつかの出力が表示されます。

Sleep 
Sleep 
Sleep 
Sleep 
Sleep 
Sleep 
Awaken 
Awaken 
Awaken 
Awaken 
... 

2)あなたは、スレッドの優先順位を変更することがありますが、それはおそらく勝ちましたあなたに何か良いことはしません。すべての.netタイマーは、リアルタイム使用のためのものではありません。だから、それについて何もすることはできません。

関連する問題