Application.Current.Dispatcher.BeginInvoke(操作)VS.Application



我正在开发一个WPF应用程序。

在服务器上,有许多线程/任务抛出UI注册到的操作

侦听器是在引发操作的同一线程上调用的,因此在UI中的侦听器中,当我想要更新UI元素时,我需要通过Application.Current.Dispatcher.BeginInvoke(action)连接到UI线程或Application.Current.Dispatcher.Invoke(action).

当很多线程引发这些操作时,会有很多对Application.Current.Dispatcher.Invoke(action)的调用(我现在使用Invoke),有时在几毫秒的范围内。

过了一段时间,如果我在Application.Current.Dispatcher.Invoke以及操作本身内部的断点,连接到UI线程Dispatcher和实际操作实际开始执行可能需要几秒钟,甚至超过5秒钟。

另一方面,为什么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更好,为什么它会更好?

就您的目的而言,InvokeBeginInvoke之间没有区别。CCD_ 3是与一个特定线程相关联的任务调度器。您可以通过InvokeBeginInvoke将任务添加到Dispatcher的优先级队列中,Dispatcher将在与其关联的线程上逐个执行这些任务。但Invoke会阻塞调用线程,直到任务完成,所以使用它可能会对您的工作线程产生负面影响。

最新更新