gpt4 book ai didi

c# - BackgroundWorker:从 DoWorkEventHandler 调用的每个方法是否都在后台线程中运行?

转载 作者:太空宇宙 更新时间:2023-11-03 22:16:40 24 4
gpt4 key购买 nike

我有一个 MVVM 应用程序,它通过服务器上的 XML 加载数据。 XML 使用 WebClient.DownloadStringAsync() 下载,然后通过一种方法进行解析。问题是 XML 有点大,因此在解析 XML 时 UI 会卡住一段时间(2-3 秒左右)。

我解决这个问题的想法是使用 BackgroundWorker 来处理解析。但是从我的 DoWorkEventHandler 调用的每个方法都在后台线程中运行吗?甚至 webclients 事件处理程序?

整个解析过程发生在 DownloadStringCompletedEventHandler 中,因此如果它不在后台线程中运行,它就毫无用处。

感谢您的帮助,Stack Overflow 到目前为止表现非常出色 :) 继续加油!

最佳答案

BackgroundWorker 使用基于事件的异步模式 (EAP) 组件时需要小心。特别是,如果它们是由 BackgroundWorker.DoWork 方法创建和启动的,那么它们将在 ThreadPool 线程而不是 UI 线程上引发事件。一个MSDN article published yesterday说明了这种情况并解释了为什么会发生这种情况。

如果您从 BackgroundWorker.DoWork(在 ThreadPool 线程上运行)调用 WebClient.DownloadStringAsync,则 DownloadStringCompletedEventHandler 将在 ThreadPool 线程上运行。但是,这可能是一个与 BackgroundWorker 线程不同的线程;并且 BackgroundWorker 可能DownloadStringCompletedEventHandler 启动时已经完成。

因此,我不会说它在 BackgroundWorker“内部”运行。相反,它以自由线程的方式运行。该事件将在 ThreadPool 线程上触发,该线程可能与 BackgroundWorker 线程相同也可能不同,BackgroundWorker 可能与也可能不同事件触发时完成。

我认为更好的解决方案可能是让 UI 线程拥有 WebClient,并让它的事件处理程序启动 BackgroundWorker。这样,两个 EAP 组件都由 UI 线程拥有,并且将按预期运行。

关于c# - BackgroundWorker:从 DoWorkEventHandler 调用的每个方法是否都在后台线程中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4896903/

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