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

8
在我的WPF应用程序中,我正在使用构造函数中的Dispatcher.BeginInvoke来加载内容。我的问题是它会阻塞UI线程吗?
还是最好使用Task.Factory.StartNew,然后将事情分派回UI,以便应用程序加载首先无论加载内容的处理时间如何?
哪种方法更好,为什么?
1个回答

22
他们执行两个非常不同的功能:
- Task.Factory.StartNew在线程池线程上调度一个委托以执行。当前线程继续运行而无需等待此任务的结果(异步)。通常,您会生成一个较长运行的后台任务,以便UI不会被阻塞太久(没有“冻结”)。 - Dispatcher.BeginInvoke在调度程序(UI)线程上调度一个委托以执行。通常,这是为了使用在后台线程上执行的某些操作的结果来更新一些UI控件。本质上,您在此更新UI。
直接回答您的问题:
您不应将长时间的操作调度到Dispatcher线程上,通常只希望在此处更新UI控件。委托中的代码将在UI线程上执行,该线程在执行期间被阻塞。只需在当前代码中放置Thread.Sleep(10000),并且您将看到UI将被冻结。对于此操作,请使用后台任务 - 使用Task或后台工作者(两者都将使用线程池线程)。
引用:“或者最好使用Task.Factory.StartNew,然后将其调度回UI,以便无论加载内容的处理时间如何,应用程序都会首先加载。”
是的!

谢谢回复,Dispatcher.BeginInvoke会阻塞我的UI吗?在我的应用程序中,我需要在加载时调用一些服务,如果服务停止,则会挂起UI,尽管我已经使用了Dispatcher.BeginInvoke,所以我的基本问题是在这种情况下使用Dispatcher还是Task? - Learner
2
如果你想让某些东西在后台运行,请使用任务(task),如果你想将结果发送到UI,请使用Dispatcher.BeginInvoke - BrokenGlass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接