更多DispatcherTimers在一个应用程序

问题描述:

我有一个应用程序的行为像autorefresh。它检查电子邮件,新视频,笑话等。更多DispatcherTimers在一个应用程序

我的客户希望这些单一的元素检查不同的时间间隔。例如,每分钟发送一次电子邮件,每小时发送一次视频等。因此,他应该有选择让自己将时间间隔写入文本框,并通过检查适当的复选框开始/停止刷新。

应用程序是用wpf编写的。我的问题是,是否更好的选择添加更多DispatcherTimers(DT),每个元素或坚持只有一个DT和在滴答功能开关?

此外,我假设DT的tick方法运行主线程。我对吗?如果可能,在不同的线程上使用tick方法运行操作会更好吗?

默认情况下,WPF应用程序具有单线程 - 主UI线程和所有UI控件/窗口被创建并与其关联。在这种情况下,我看不到任何好处,因为无论如何Dispatcher Timer会将所有消息委托给关联的Dispatcher的消息循环什么是主UI线程消息循环。

但如果你已经创造了一些控制在单独的工作线程像

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

而且将邮件投递到该窗口,以及 - 的话很有道理创建一个新的调度,并用手工创建的线程关联,所以基本上每个Dispatcher都将与自己的线程关联,因此关系为1到1.

关于atick方法 - 它将在与Dispatcher线程关联的位置执行。如果您还没有创建与手动创建的工作线程相关的调度,所以默认WPF调度与主UI线程关联,

MSDN:

理由使用而不是一个System.Timers一个DispatcherTimer。定时器 是该DispatcherTimer运行同一个线程分派 上和的DispatcherPriority可以在DispatcherTimer

+0

我的英语不够好,无法完全理解您的回复。你能以某种方式抚慰,你会如何解决我的任务? – 2012-02-15 12:49:59

+0

@Andrew:** 1)**如果您创建了任何线程,并且在此线程中创建了新的控件/窗口 - 为每个手动创建的线程使用单独的“Dispatcher && DispatcherTimer”** 2)**如果您尚未创建任何控件在手动创建的线程中手动 - 使用Dispatcher.Current应该对应于主UI线程 – sll 2012-02-15 13:21:36

+0

好吧,所有控件都是在UI线程上创建的。因此,您建议我只创建一个DispatcherTimer,计数刻度并使用开关来保持下载功能? – 2012-02-15 20:21:19

设置让它尽可能简单。只要检查新元素不耗费时间,只需使用一个DispatcherTimer(每个元素类别拥有自己的Tick处理程序)(当然,如果您没有数百个类别)。

如果检查操作很耗时,则会阻止Tick处理程序以及UI线程。然后,您可以使用每个元素类别的一个System.Timers.Timer,并在定时器的Elapsed处理程序(而不是Tick)中检查新元素。由于定时器运行在不同的线程上(来自线程池),您将不得不与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,该怎么办?我应该再次使用系统TImer吗?你知道任何源码/例子,我可以看看与UI线程的同步吗? – gts13 2017-11-13 11:48:39

+0

任何耗时的任务当然都不应该在UI线程中运行。使用Timer或ThreadPool线程或其他。 – Clemens 2017-11-13 11:52:44