【问题标题】:Can Multiple BackgroundWorkers use the same Function / end Variable?多个 BackgroundWorkers 可以使用相同的 Function / end 变量吗?
【发布时间】:2014-04-21 09:20:43
【问题描述】:

如果假设我有,那可以吗

BackgroundWoker1
BackgroundWoker2

他们俩都有:

AddHandler BackgroundWoker1.DoWork, AddressOf requestDataTravelPackagesName
AddHandler BackgroundWoker1.ProgressChanged, AddressOf showLoadingAnim

在另一行(使用不同的时间)

AddHandler BackgroundWoker2.DoWork, AddressOf requestDataTravelPackagesName
AddHandler BackgroundWoker2.ProgressChanged, AddressOf showLoadingAnim

这是允许的吗?因为我尝试了类似的事情,我的表单似乎出现了故障。 但它没有给我任何错误/消息。框架 (GUI) 刚刚消失。

我在想这可能是因为我有多个后台工作人员。可能他们正在访问相同的变量(在完成的函数中)或类似的函数/等。

【问题讨论】:

  • 实际上我建议避免使用 BackgroundWorkers,因为有更好的选择,例如任务、线程、线程池等。
  • @Trade,我完全不同意。完全没有理由避免使用 BackgroundWorkers。我可以看到您可能会建议如何使用 Task 代替,但建议在适合使用 BackgroundWorker 的地方使用 Thread 或 ThreadPool 类,即在窗体或窗口中执行后台任务,这只是一个糟糕的建议。
  • 嗯,我认为 BackgroundWorker 并不是一个很好的解决方案。我没有得到很好的经验。我也有点想念那里的异常处理,因为它吞下异常并进入 RunWorkerCompleted-event 等。这有点令人困惑。优点是可以直接向 UI 报告进度,但总的来说我更喜欢任务,它只是更现代并带来了很多不错的功能。
  • @Trade,您可以在 DoWork 事件处理程序中处理异常,其方式与在其他任何地方处理异常的方式完全相同,对于未处理的异常,RunWorkerCompleted 事件处理程序提供 e.Error 属性。 BackgroundWorker 遇到的任何问题都是由于您没有正确使用它造成的。如果您将多线程直接构建到窗体或窗口中(这本身可能不是一个好主意,但这是另一个问题),那么 BackgroundWorker 可能是一个很好的解决方案。它不是每项工作的最佳工具,但在某些工作中它比其他工具更好。
  • 是的,但是需要调用 e.Error-property 有点混乱,特别是对于刚接触 BGW 的人来说,因为你不明白为什么没有出现异常。如果是这样,您可以使用 BGW 来完成,但无论如何我更喜欢任务。

标签: vb.net thread-safety backgroundworker


【解决方案1】:

原则上你的建议绝对没有问题。如果有问题,那就是你的实现。

DoWork 事件处理程序只是一个在辅助线程上执行的方法。同时在多个线程上执行相同的方法是很常见的,这没有问题。 ProgressChanged 事件处理程序在 UI 线程上执行,因此您永远不会一次执行多个实例。

与所有多线程场景一样,您始终需要确保同步访问公共数据。还必须考虑单线程代码可能出现的所有问题,以及避免可能的对控件的跨线程访问。

要了解您的具体情况是什么问题,我们需要确切了解您的具体情况会发生什么。

【讨论】:

  • 不是一个有用的评论,但完全同意你的看法。太棒了。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多