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

标签 c# .net silverlight backgroundworker

我有一个 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/

相关文章:

c# - 如何在 C# 中格式化显示在 MessageBox 中的字符串?

c# - 控制台应用程序 C# 中的 App.Config 文件

c# - 检测损坏的图像文件

.net - 如何从azure devops管道中的另一个包源安装nuget包?

Silverlight 3 Beta,ViewModel 中的 NavigationService

silverlight - WPF : Stretching multiple paths relatively

c# - 插入数据并用新数据刷新数据网格后关闭弹出窗口

c# - 如何使用NuGet?

c# - 通过 TCP 处理客户端/服务器通信 - 一般问题

c# - 带有 asp.net mvc 3 的 jquery 网络摄像头插件