Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Application.Current.Dispatcher.BeginInvoke(操作)与Application.Current.Dispatcher.Invoke(操作)(WPF)_C#_Wpf_Multithreading - Fatal编程技术网

C# Application.Current.Dispatcher.BeginInvoke(操作)与Application.Current.Dispatcher.Invoke(操作)(WPF)

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的

我正在开发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线程繁忙时启动得更快。我说得对吗

我的目的是:

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方法。