我正在处理WPF应用程序。
在服务器上,有许多线程/任务引发UI注册到的动作。
在引发操作的同一线程上调用侦听器,因此在UI的侦听器中,当我想更新UI元素时,需要通过Application.Current.Dispatcher.BeginInvoke(行动) 或Application.Current.Dispatcher.Invoke(操作)。
当许多线程引发这些动作时,会有许多对Application.Current.Dispatcher.Invoke(action)的调用(我现在使用Invoke),有时在几毫秒的范围内。
过一会儿,如果我在 Application.Current.Dispatcher.Invoke 以及动作本身内部的断点,可能需要几秒钟甚至超过5秒钟的时间才能连接到UI线程Dispatcher,并且实际的动作才能真正开始执行。
另一方面,为什么Application.Current.Dispatcher.BeginInvoke(action)解决我的问题?
我的意思是,我们只有一个UI线程,因此BeginInvoke方法将把很多操作放在一个队列中,并且动作X仍然需要很多时间才能发生。我认为这不会使应该在UI线程上运行的任何动作更快地启动(当UI线程繁忙时)。我说的对吗?
我的目的是:
private void UpdateScreen(){
Application.Current.Dispatcher.Invoke(() =>
{
OnPropertyChanged(() => Time);
OnPropertyChanged(() => TimeFormatted);
OnPropertyChanged(() => SliderText);
});}
我希望操作开始执行行
OnPropertyChanged(() => Time);
OnPropertyChanged(() => TimeFormatted);
OnPropertyChanged(() => SliderText);
当我进入方法UpdateScreen()时尽快
如果实际上更好,为什么BeginInvoke会比Invoke更好?
答案 0 :(得分:0)
出于您的目的,Invoke
和BeginInvoke
之间没有区别。 Dispatcher
是与一个特定线程关联的任务计划程序。您可以通过Invoke
或BeginInvoke
将任务添加到Dispatcher
的优先队列中,Dispatcher
将在与之关联的线程上一个接一个地执行任务。但是Invoke
将阻塞调用者线程,直到任务完成为止,因此使用它可能会对您的工作线程产生负面影响。