【发布时间】:2012-03-31 15:07:32
【问题描述】:
在我的 WPF 应用程序中,我在构造函数中使用 Dispatcher.BeginInvoke 加载内容。我的问题是它会阻塞 UI 线程吗?
或者最好使用Task.Factory.StartNew,然后在 UI 上分派内容,以便应用程序首先加载,而不管加载内容的处理时间如何?
哪种方法更好,为什么?
【问题讨论】:
标签: c# wpf task-parallel-library
在我的 WPF 应用程序中,我在构造函数中使用 Dispatcher.BeginInvoke 加载内容。我的问题是它会阻塞 UI 线程吗?
或者最好使用Task.Factory.StartNew,然后在 UI 上分派内容,以便应用程序首先加载,而不管加载内容的处理时间如何?
哪种方法更好,为什么?
【问题讨论】:
标签: c# wpf task-parallel-library
他们做了两件非常不同的事情:
Task.Factory.StartNew 安排委托在
线程池线程。当前线程继续运行而不等待此任务的结果(异步)。通常,您会生成一个运行时间较长的后台任务,以便 UI 不会被阻塞太久(不是“冻结”)。
Dispatcher.BeginInvoke 安排委托在
调度程序(UI)线程。通常这样做是为了更新一些 UI
控制与在 a 上执行的某些操作的结果
后台线程。本质上,您是在此处更新 UI。
直接回答你的问题:
您不应在 Dispatcher 线程上安排冗长的操作,通常您只想在此处更新 UI 控件。委托中的代码将在 UI 线程上执行,该线程在执行期间被阻塞。只需将Thread.Sleep(10000) 放入您当前的代码(您从构造函数中安排),您就会看到 UI 将冻结。为此使用后台任务 - 使用 Task 或后台工作者(两者都将使用线程池线程)。
或者使用Task.Factory.StartNew然后调度更好 事情回到 UI 上,这样应用程序将首先加载,而不管 加载内容处理时间。
是的!
【讨论】:
Dispatcher.BeginInvoke