3

我有一个行为类似于自动刷新的应用程序。它检查电子邮件、新视频、笑话等。

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

应用程序是用 wpf 编写的。我的问题是,添加更多(DT)是否是更好的选择DispatcherTimers,每个元素一个或只坚持一个DT并在刻度功能中进行切换?

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

4

2 回答 2

4

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

如果检查操作很耗时,它将阻塞Tick处理程序,从而阻塞 UI 线程。然后,您可以为每个元素类别使用一个System.Timers.Timer,并在 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
}
于 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 线程关联的线程上执行。如果您尚未创建与手动创建的工作线程关联的调度程序,那么默认情况下 WPF 调度程序与主 UI 线程关联,

MSDN:

使用 DispatcherTimer 而不是 System.Timers.Timer 的原因是 DispatcherTimer 与 Dispatcher 在同一线程上运行,并且可以在 DispatcherTimer 上设置 DispatcherPriority

于 2012-02-15T11:50:09.823 回答