Dispatcher.BeginInvoke和Task.Factory.StartNew之间有什么区别

Lea*_*ner 8 c# wpf task-parallel-library

在我的WPF应用程序中,我Dispatcher.BeginInvoke在构造函数中使用加载内容.我的问题是它会阻止UI线程吗?

或者是否更好地使用Task.Factory.StartNew然后在UI上调度回来,以便无论加载内容处理时间如何,应用程序都将首先加载?

哪种方法更好,为什么?

Bro*_*ass 22

他们做了两件截然不同的事:

  • Task.Factory.StartNew调度委托以在线程池线程上执行.当前线程继续运行而不等待此任务的结果(异步).通常,您会生成一个运行时间较长的后台任务,以便UI不会被阻塞太长时间(而不是"冻结").

  • Dispatcher.BeginInvoke调度委托以在调度程序(UI)线程上执行.通常,这是为了使用在后台线程上执行的某些操作的结果来更新某些UI控件.基本上你在这里更新UI.

直接回答你的问题:

您不应该在Dispatcher线程上安排冗长的操作,通常您只想在此处更新UI控件.委托中的代码将在UI线程上执行,该线程在执行时被阻止.只需Thread.Sleep(10000)在您当前的代码中(您从构造函数中安排),您将看到UI将冻结.使用后台任务 - 使用Task或后台工作程序(两者都将使用线程池线程).

或者最好使用Task.Factory.StartNew然后在UI上调度回来,以便无论加载内容处理时间如何,应用程序都将首先加载.

是!

  • 如果你想在*background*中运行某些东西*使用任务,如果你想将结果发送到UI使用`Dispatcher.BeginInvoke` (2认同)