gpt4 book ai didi

WPF BackgroundWorker 与 Dispatcher

转载 作者:行者123 更新时间:2023-12-03 08:56:25 26 4
gpt4 key购买 nike

在我的 WPF 应用程序中,我需要执行异步操作,然后我需要更新 GUI。而这件事我必须在不同的时刻用不同的操作多次做。我知道有两种方法可以做到这一点:Dispatcher 和 BackgroundWorker。

因为当我选择的时候,我很难回去,我问你:什么更好?选择其中一个而不是另一个的原因是什么?

谢谢!
皮莱吉

最佳答案

Dispatcher 与其他线程方法的主要区别在于 Dispatcher 实际上并不是多线程的。 Dispatcher 管理控件,这些控件需要单个线程才能正常运行; Dispatcher 的 BeginInvoke 方法将事件排队以供稍后执行(取决于优先级等),但仍位于同一线程上。

另一方面,BackgroundWorker 实际上在调用它的同时在一个单独的线程中执行代码。它也比真正的线程更容易使用,因为它自动与应用程序的主线程同步(至少我认为我没记错),主线程负责控件和消息队列(在 WPF 和Silverlight),因此在从后台线程更新控件时无需使用 Dispatcher.Invoke(或 WinForms 中的 Control.Invoke),尽管可能并不总是建议这样做。

正如 Reed 所说,Task Parallel Library 是一个很好的替代选择。

编辑:进一步观察。

正如我上面所说,Dispatcher 并不是真正的多线程。它只会给人一种错觉,因为它确实会运行您在其他时间传递给它的委托(delegate)。只有当代码真的只处理应用程序的 View 方面——即控件、页面、窗口等等时,我才会使用 Dispatcher。当然,它的主要用途实际上是触发来自其他线程的操作以正确或在正确的时间更新控件(例如,仅在某些控件完全呈现/布局本身之后设置焦点最容易使用 Dispatcher 完成,因为在 WPF 渲染中并不是完全确定的)。

BackgroundWorker 可以使多线程代码比平时简单得多;这是一个简单易懂的概念,最重要的是(如果有意义的话)您可以从中派生自定义工作器,它们可以是异步执行单个任务的专用类,具有可以用作参数、进度通知和取消等的属性. 我总是发现 BackgroundWorker 有很大的帮助(除非我必须从中派生以保持原始线程的文化以正确维护本地化:P)

最强大但也最困难的方法是使用可用的最低级别 System.Threading.Thread;但是很容易出错,因此不推荐使用。多线程编程是 ,这是给定的。但是,如果您想了解所有方面,这里有很多很好的信息:this excellent article我们的好伙伴 Jon Skeet 立即跳到了我的脑海(文章的最后一页也有很多非常有趣的链接)。

在 .Net 4.0 中,我们有一个不同的选项,任务并行库。我还没有使用它太多,但从我所看到的情况来看,它令人印象深刻(而且 PLINQ 简直太棒了)。如果您有学习它的好奇心和资源,这就是我的建议(毕竟学习它不应该花那么多时间)。

关于WPF BackgroundWorker 与 Dispatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3762576/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com