C# Application.Current.Dispatcher.BeginInvoke(操作)与Application.Current.Dispatcher.Invoke(操作)(WPF)
我正在开发WPF应用程序 在服务器上,有许多线程/任务抛出UI注册到的操作 监听器是在引发操作的同一线程上调用的,因此在UI中的监听器中,当我想要更新UI元素时,我需要通过Application.Current.Dispatcher.BeginInvokeaction连接到UI线程 或Application.Current.Dispatcher.Invokeaction 当很多线程引发这些操作时,就会有很多对Application.Current.Dispatcher.Invokeaction的调用,我现在使用Invoke,有时在几毫秒的范围内 一段时间后,如果我在 Application.Current.Dispatcher.Invoke 在操作本身内部有一个断点,连接到UI线程调度程序和实际操作实际开始执行可能需要几秒钟,甚至超过5秒钟 另一方面,为什么Application.Current.Dispatcher.BeginInvokeaction会解决我的问题 我的意思是,我们只有一个UI线程,所以BeginInvoke方法将把这些操作放在一个队列中,而动作X仍然需要很多时间。我认为这不会使任何应该在UI线程上运行的操作在UI线程繁忙时启动得更快。我说得对吗 我的目的是:C# Application.Current.Dispatcher.BeginInvoke(操作)与Application.Current.Dispatcher.Invoke(操作)(WPF),c#,wpf,multithreading,C#,Wpf,Multithreading,我正在开发WPF应用程序 在服务器上,有许多线程/任务抛出UI注册到的操作 监听器是在引发操作的同一线程上调用的,因此在UI中的监听器中,当我想要更新UI元素时,我需要通过Application.Current.Dispatcher.BeginInvokeaction连接到UI线程 或Application.Current.Dispatcher.Invokeaction 当很多线程引发这些操作时,就会有很多对Application.Current.Dispatcher.Invokeaction的
private void UpdateScreen(){
Application.Current.Dispatcher.Invoke(() =>
{
OnPropertyChanged(() => Time);
OnPropertyChanged(() => TimeFormatted);
OnPropertyChanged(() => SliderText);
});}
我希望操作开始执行这些行
OnPropertyChanged(() => Time);
OnPropertyChanged(() => TimeFormatted);
OnPropertyChanged(() => SliderText);
当我使用UpdateScreen方法时尽快
为什么BeginInvoke比Invoke更好,如果它实际上更好的话?就您的目的而言,Invoke和BeginInvoke之间没有区别。Dispatcher是与一个特定线程关联的任务调度器。您可以通过Invoke或BeginInvoke将任务添加到调度程序的优先级队列中,调度程序将在与其关联的线程上逐个执行任务。但Invoke将阻止调用线程,直到任务完成,所以使用它可能会对您的工作线程产生负面影响 Invoke是一个严重的设计错误。只有当您需要返回值时才需要它,如果需要,那么您就隐藏了线程竞赛bug。遗憾的是,直到UWP,微软才意识到这个错误,CoreDispatcher只有一个RunAsync方法。