【发布时间】: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