Application.Current.Dispatcher.BeginInvoke(action)VS。 Application.Current.Dispatcher.Invoke(action)(WPF)

时间:2019-02-13 12:05:00

标签: c# wpf multithreading

我正在处理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更好?

1 个答案:

答案 0 :(得分:0)

出于您的目的,InvokeBeginInvoke之间没有区别。 Dispatcher是与一个特定线程关联的任务计划程序。您可以通过InvokeBeginInvoke将任务添加到Dispatcher的优先队列中,Dispatcher将在与之关联的线程上一个接一个地执行任务。但是Invoke将阻塞调用者线程,直到任务完成为止,因此使用它可能会对您的工作线程产生负面影响。