更多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线程关联,
理由使用而不是一个System.Timers一个DispatcherTimer。定时器 是该DispatcherTimer运行同一个线程分派 上和的DispatcherPriority可以在DispatcherTimer
设置让它尽可能简单。只要检查新元素不耗费时间,只需使用一个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
}
我的英语不够好,无法完全理解您的回复。你能以某种方式抚慰,你会如何解决我的任务? – 2012-02-15 12:49:59
@Andrew:** 1)**如果您创建了任何线程,并且在此线程中创建了新的控件/窗口 - 为每个手动创建的线程使用单独的“Dispatcher && DispatcherTimer”** 2)**如果您尚未创建任何控件在手动创建的线程中手动 - 使用Dispatcher.Current应该对应于主UI线程 – sll 2012-02-15 13:21:36
好吧,所有控件都是在UI线程上创建的。因此,您建议我只创建一个DispatcherTimer,计数刻度并使用开关来保持下载功能? – 2012-02-15 20:21:19