3

自動更新のように動作するアプリケーションがあります。メール、新しいビデオ、ジョークなどをチェックします。

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

アプリケーションはwpfで書かれています。私の質問は、要素DispatcherTimersごとに1つずつ、さらに(DT)を追加するのが良いのか、それとも1つだけでスティック機能を使用してスイッチを作成するのが良いのかということです。DT

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

4

2 に答える 2

4

できるだけシンプルにしてください。新しい要素をチェックするのに時間がかからない限り、要素カテゴリごとDispatcherTimerに独自のTickハンドラーを持つものを使用するだけです (もちろん、何百ものカテゴリがない場合)。

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

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

private void UpdateUI()
{
    // update UI components
}
于 2012-02-15T15:05:03.057 に答える
3

デフォルトでは、WPF アプリケーションには単一のスレッド (メイン UI スレッド) があり、すべての UI コントロール/ウィンドウが作成され、それに関連付けられます。この場合、複数の Dispatcher と Dispatcher Timer を使用しても利点は見られません。いずれにせよ、Dispatcher Timer はすべてのメッセージを関連する Dispatcher のメッセージ ループ (メイン UI スレッド メッセージ ループ) に委譲するためです。

ただし、次のような別のワーカー スレッドでいくつかのコントロールを作成した場合

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

また、このウィンドウにもメッセージを投稿します。新しい Dispatcher を作成し、手動で作成したスレッドに関連付けることは理にかなっています。したがって、基本的に各 Dispatcher は独自のスレッドに関連付けられるため、関係は 1 対 1 になります。

atick メソッドについて - Dispatcher スレッドに関連付けられた上で実行されます。手動で作成されたワーカー スレッドに関連付けられたディスパッチャーを作成していない場合、既定では、メイン UI スレッドに関連付けられた WPF ディスパッチャーが、

MSDN:

System.Timers.Timer ではなく DispatcherTimer を使用する理由は、DispatcherTimer が Dispatcher と同じスレッドで実行され、DispatcherTimer で DispatcherPriority を設定できるためです。

于 2012-02-15T11:50:09.823 に答える