您多久在UI中使用System.Component.BackgroundWorker? (如果曾经)

时间:2008-09-08 14:25:29

标签: .net winforms multithreading user-interface

我确信响应式用户界面是每个人都在努力争取的东西,而推荐的做事方式就是使用BackgroundWorker。

您觉得使用起来容易吗?你经常使用它吗?或者你有自己的框架来完成冗长的任务和报告过程。

我发现我正在使用它,甚至在我需要某种进度报告的地方使用它的代表。

6 个答案:

答案 0 :(得分:3)

BackgroundWorker使事情变得更容易。我发现困难的一件事是Backgroundworker本身具有线程亲和力,即使它应该隐藏线程切换问题。在每种情况下它都不会自动切换到UI线程。它需要从UI线程创建并运行,以便正确地进行线程切换。

答案 1 :(得分:3)

多线程编程在开始时很难掌握(退伍军人有时仍会失败)而BackgroundWorker使它更容易使用。我喜欢BackgroundWorker具有易于实现的功能,但更容易以一种微妙的方式错误地实现,例如取消。 我使用它,如果我有并需要进度更新,所以我可以显示一个有意义的进度条。

如果没有,我使用一个Thread(或从ThreadPool借用),因为我不需要BackgroundWorker的所有功能,并且对线程有足够的熟练程度来启动一个Thread并等待它停止。

对于非相关任务的代理,我使用Thread类的代理,如普通void ThreadStart(),或者我创建自己的代码。

答案 2 :(得分:1)

我常常将它用于进度指示和后台数据加载\处理等任务 最近我发现不支持开箱即用的用例。这是“可覆盖的任务”。然而Patric Smacchia提出了不错的solution

答案 3 :(得分:1)

我曾经使用过一次并且对它非常满意。通常,不需要“大”多线程,但只需要2个线程(UI和工作者),并且它可以很好地工作,而不必过多担心底层的线程逻辑。

答案 4 :(得分:0)

@Gulzar感谢您提供以下信息:需要创建并从UI线程运行,以便正确地进行线程切换。

使用我找到的后台工作程序时要注意的一件事是异常处理。

如果在异步进程上抛出异常,它将不会向主线程抛出异常,该进程将完成,并且将触发BackgroundWorker RunWorkerCompleted事件,并在RunWorkerCompletedEventArgs.Error中隐藏该错误。

我喜欢BackgroundWorker具有易于实现但更容易以错误方式错误实现的功能,例如取消。

答案 5 :(得分:-1)

后台工作者班的最大问题是,由于取消,工作人员完全无法知道何时完成。 BackgroundWorker不公开它使用的线程,因此您不能使用标准技术来同步线程终止(连接等)。你也不能只是在UI线程的循环中等待它结束,因为RunWorkerCompleted事件永远不会被解雇。我一直不得不使用的黑客只是设置一个标志然后启动一个计时器,它将继续检查后台工作程序是否结束。但它非常混乱,使业务逻辑复杂化。

只要您不需要支持确定性取消,那就太棒了。