2012-02-15 5 views
2

私はアプリケーションが自動リフレッシュのように動作しています。DispatcherTimersを1つのアプリケーションに追加

私のクライアントは、これらの単一の要素が異なる間隔でチェックしたいと思っています。毎分毎分の電子メール、毎時のビデオなどです。したがって、彼自身がテキストボックスに間隔を書き留めて、適切なチェックボックスのチェックを開始/停止するオプションが必要です。

アプリケーションはwpfで書かれています。私の質問は一つだけDTとし、ダニ機能のメークスイッチによりDispatcherTimers(DT)、要素ごとに1つを追加したり、固執するより良いオプションがあるかどうか、ですか?

また、DTのtickメソッドがメインスレッドを実行しているとします。私は正しい?可能であれば、別のスレッドでtickメソッドの中で操作を実行する方が良いでしょうか?

答えて

2

デフォルトでは、WPFアプリケーションには1つのスレッドがあります。メインUIスレッドとすべてのUIコントロール/ウィンドウが作成され、関連付けられています。この場合、ディスパッチャー・タイマーは、すべてのメッセージを関連するDispatcherのメッセージ・ループに委譲してから、メインUIスレッド・メッセージ・ループになるので、複数のディスパッチャーとディスパッチャー・タイマーを使用する利点はありません。

しかし、あなたは

var thread = new Thread(() => 
     { 
       CustomWindow wnd = new CustomWindow(); 
     }; 

のような個別のワーカースレッドでいくつかのコントロールを作成したとしても、このウィンドウにメッセージを投稿するかの - それは感覚の新しいディスパッチャを作成し、手動で作成されたスレッドと関連付けを行い、基本的に各ディスパッチャーは自分のスレッドに関連付けられているので、リレーションは1対1です。

アティクティックメソッドについては、Dispatcherスレッドに関連付けて実行されます。手動で作成したワーカースレッドに関連付けられているディスパッチャを作成していないしている場合、System.Timersに反対DispatcherTimerを使用するための

MSDN:

理由、メインUIスレッドに関連付けられたデフォルトWPFディスパッチャによってそう。タイマー はそれをできるだけシンプルにDispatcherTimerはDispatcherの と同じスレッド上で実行されたDispatcherPriorityはDispatcherTimer

+0

私の英語ではあなたの回答を十分に理解するには十分ではありません。どういうわけか、あなたは私の仕事をどうやって解決しますか? –

+0

@Andrew:** 1)**スレッドを作成してこのスレッドで新しいコントロール/ウィンドウを作成した場合、手動で作成したスレッドごとに別々の 'Dispatcher && DispatcherTimer'を使います** 2)手動で作成されたスレッドで手動で作成する - メインUIスレッドに対応するDispatcher.Currentを使用する – sll

+0

すべてのコントロールはUIスレッドで作成されます。したがって、あなたは私にただ1つのDispatcherTimerを作成し、ダニをカウントし、スイッチを使ってその機能をダウンロードするよう勧めますか? –

3

に設定することができます。限り、それはないとして、単純に(そしてもちろんあなたはカテゴリの数百を持っていない場合)要素カテゴリごとに独自のTickハンドラで1 DispatcherTimerを使用し、新しい要素を確認するために、時間がかかります。

チェック操作には時間がかかり、それはTickハンドラので、UIスレッドをブロックする場合には。次に、要素カテゴリごとに1つのSystem.Timers.Timerを使用して、Tickの代わりに、タイマのElapsedハンドラの新しい要素のチェックを実行できます。タイマーは異なるスレッド(スレッドプール)から実行されるため、UIスレッドと同期する必要があります。

private void VideosTimerElapsed(object sender, ElapsedEventArgs e) 
{ 
    // check for new videos... 
    Dispatcher.BeginInvoke(new Action(UpdateUI)); 
} 

private void UpdateUI() 
{ 
    // update UI components 
} 
+0

UIを更新する2つの時間がかかるタスクを実行する必要がある場合はどうすればよいですか?私はSystem TImerにもう一度行くべきですか?あなたはUIスレッドとの同期を見てみることができるソース/例を知っていますか? – gts13

+0

時間のかかる作業は、もちろんUIスレッドでは実行しないでください。タイマーやThreadPoolスレッドなどを使用します。 – Clemens

関連する問題