2017-06-20 4 views
0

ディスパッチャータイマーは500msごとにハートビートのように動作し、anybusのレジスターに書き込む必要があります。私は最大の優先順位でそれを設定していますWpfディスパッチャータイマーが異常に変化する

m_HeartBeatTimer = new DispatcherTimer(DispatcherPriority.Render); 

問題は、プログラムが時々動作しているときの間隔が非常に19秒まで長く得ることができるということです。

[20/06/2017 17:00 :01.182]ハートビート1 79

[20/06/2017 17:00:20.669]ハートビート0~80

もちろん、他のタイマー及び他の操作が、shouldnがありますタイマーはそれらのものに鈍感ではありませんか?

正しいタイミングを尊重する方法はありますか? ありがとう

+0

あなたのプログラムには、UIスレッドをブロックするものがあります。 – Clemens

+0

ディスパッチャのタイマーがUIスレッドにありません。それはインターフェイスを超えています。他のタスクに関係なく設定する方法はありますか? – Luca

+1

DispatcherTimerがUIスレッドで実行されています –

答えて

0

.netにはいくつかの種類のタイマーがあります。 Windows.Forms.TimerとDispatcherTimerは両方ともUIスレッド上で実行されます。 UIスレッドがビジーでないときにのみチェックします。UIスレッドが何らかのタスクにロックされている場合、そのタスクが完了するまでティックは待機します。

本当のハートビートが必要な場合は、代わりにSystem.Threading.Timerを使用することをおすすめします。これはワーカースレッドでチェックされるので、そのことを覚えておいてください。

private System.Threading.Timer _timer; 

private void go() 
{ 
    _timer = new Timer(_ => Timer_Tick(), null, 0, 1000 * 10); //every 10 seconds 
} 

private void Timer_Tick() 
{ 
    //this is not the main UI thread. Must invoke if you want to interact with the UI 
} 
+0

いいえ、うんざりしていません。他のタイマーと同じようにランダムにブロックされます。 – Luca

関連する問題