2

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

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

4

1 回答 1

4

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

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

  • 工作线程应该仍然能够访问控件的属性,即使它已被释放。这通常不是问题,您存储简单的支持变量的值,它们不会在控件被释放时变得无效。顺便说一句,易于测试,但是如果您不确定,那么使用一个简单的类来存储需要保留的值并将其传递给 RunWorkerAsync() 总是安全的。

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

于 2014-04-09T22:00:22.503 回答