我有一个 MVVM 应用程序,它通过服务器上的 XML 加载数据。 XML 使用 WebClient.DownloadStringAsync()
下载,然后通过一种方法进行解析。问题是 XML 有点大,因此在解析 XML 时 UI 会卡住一段时间(2-3 秒左右)。
我解决这个问题的想法是使用 BackgroundWorker 来处理解析。但是从我的 DoWorkEventHandle
r 调用的每个方法都在后台线程中运行吗?甚至 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/