处理正在运行的BackgroundWorker

时间:2014-04-09 21:05:45

标签: c# winforms backgroundworker idisposable system.componentmodel

我已经看到很多关于在Windows窗体应用程序中处理BackgroundWorker的问题,并且看来共识是它们在大多数情况下不需要手动处理。但是,我有一个关于如何处理在BackgroundWorker实际运行时正在处理的UserComponent的问题。 (IsBusy返回true)是否应该以任何特定方式处理这种情况?

例如,我有一个UserControl(类似于面板的对象),用户可以输入设置信息。它包含一个BackgroundWorker,可以保存用户的配置。当面板失去焦点(离开事件)时,如果检测到更改,如果它尚未运行以将配置保存到文件,则会将其旋转。由于Leave事件也可能是用户切换到另一个屏幕,因此现在将处理该面板。如果BackgroundWorker仍在运行,我是否需要在UserComponent本身的Dispose方法中处理它?<​​/ p>

1 个答案:

答案 0 :(得分:4)

这取决于,我们无法看到您的代码。首先,你不太可能实现CancelAsync(),所以不要为此烦恼。旋转直到IsBusy在Dispose()方法中返回 false 是一个选项,但要注意死锁。当您为RunWorkerCompleted实现事件处理程序时,您肯定会得到一个。你不太可能有这么好的旋转应该没问题。

理智的方法是让它运行。用户会很高兴。一些预防措施是必要的:

  • 工作线程应该仍然能够访问控件的属性,即使它被处理掉了。这通常不是问题,您存储简单支持变量的值,它们在处理控件时不会变为无效。很容易测试btw,但是如果你不确定那么使用一个简单的类来存储需要保存的值并将它传递给RunWorkerAsync()总是安全的。

  • 您需要处理由于程序终止而导致工作线程中止的风险。如果发生这种情况就像编写文件一样,那么文件就会被破坏。您可以通过写入另一个文件来解决此问题。并使用File.Replace()来交换它。通常总是您在替换文件时应该使用的策略。