c# - Dispatcher.BeginInvoke 和 Task.Factory.StartNew 有什么区别

标签 c# wpf task-parallel-library

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

或者使用 Task.Factory.StartNew 然后将内容分派(dispatch)回 UI 是否更好,这样应用程序将首先加载而不考虑加载内容处理时间?

哪种方法更好,为什么?

最佳答案

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

  • Task.Factory.StartNew 安排一个委托(delegate)在 线程池线程。当前线程继续运行而不等待此任务的结果(异步)。通常,您会产生一个运行时间更长的后台任务,这样 UI 就不会被阻塞太久(不是“卡住”)。

  • Dispatcher.BeginInvoke 安排一个委托(delegate)在 调度程序 (UI) 线程。通常这样做是为了更新一些 UI 控制与在一个上执行的某些操作的结果 后台线程。本质上,您是在此处更新 UI。

直接回答你的问题:

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

Or is it better to use Task.Factory.StartNew and then dispatching things back on UI so that application will load first irrespective of the loading content process time.

是的!

关于c# - Dispatcher.BeginInvoke 和 Task.Factory.StartNew 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9953132/

相关文章:

c# - 如何在ado net中使用UPDATE

c# - 不能加倍。解析字符串

c# - 无法为对象类重载运算符 '+'

wpf mvvm .. 访问 View 模型中的 View 元素

c# - MVVM 初学者教程?

c# - Parallel.Invoke 什么时候有用?

C# 圆形科学记数法值

wpf - 为 ListView 列设置不同的对齐方式

c# - 取消对 SSRS 的长时间运行的异步 WCF 调用

c# - 当无法到达取消 token 时,如何中止或终止 TPL 任务?