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

本文关键字:之间 什么 区别 StartNew Factory BeginInvoke Task Dispatcher | 更新日期: 2023-09-27 18:29:31

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

还是最好使用Task.Factory.StartNew,然后在UI上重新调度内容,这样无论加载内容的处理时间如何,应用程序都将首先加载?

哪种方法更好,为什么?

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

他们做两件非常不同的事情:

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

  • Dispatcher.BeginInvoke计划在调度器(UI)线程。通常这样做是为了更新某些UI控件上执行的某些操作的结果背景线程。从本质上讲,您正在更新此处的UI。

直接回答您的问题:

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

还是最好使用Task.Factory.StartNew,然后进行调度将东西放回UI,以便应用程序将首先加载加载内容处理时间。

是的!

相关文章: