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

时间:2012-03-31 04:56:02

标签: c# wpf task-parallel-library

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

或者最好使用Task.Factory.StartNew然后在UI上重新发送内容,以便无论加载内容的处理时间如何,都将首先加载应用程序?

哪种方法更好?为什么?

1 个答案:

答案 0 :(得分:22)

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

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

  • Dispatcher.BeginInvoke安排委托执行 调度程序(UI)线程。通常这样做是为了更新某些UI 控件与一些在a上执行的操作的结果 背景线程。基本上你在这里更新UI。

直接回答你的问题:

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

  

或者使用Task.Factory.StartNew然后调度更好   在UI上返回的东西,以便应用程序将首先加载,而不管是什么   加载内容处理时间。

是!

相关问题