我在 SO 上看到了很多关于在 Windows 窗体应用程序中处理后台工作程序的问题,似乎一致认为在大多数情况下不需要手动处理它们。但是,我有一个关于如何处理当BackgroundWorker实际运行时正在处置的UserComponent的问题。 (IsBusy
返回 true)这种情况应该以任何特定方式处理吗?
例如,我有一个 UserControl(类似面板的对象),用户可以输入设置信息。它包含一个保存用户配置的BackgroundWorker。当面板失去焦点(离开事件)时,如果检测到更改,它会启动后台工作程序(如果它尚未运行)以将配置保存到文件。由于离开事件也可能是用户更改到另一个屏幕,因此现在将处理该面板。如果BackgroundWorker仍在运行,我是否需要在UserComponent本身的Dispose方法中处理这个问题?
最佳答案
这要看情况,我们看不到您的代码。首先,您不太可能实现 CancelAsync(),因此不必为此烦恼。旋转直到 IsBusy 在 Dispose() 方法中返回 false 是一种选择,但请注意死锁。当您为 RunWorkerCompleted 实现事件处理程序时,您肯定会得到一个。你不太可能有一个,所以旋转应该没问题。
明智的做法是让它运行。用户会很高兴。一些预防措施是必要的:
工作线程应该仍然能够访问控件的属性,即使它已被释放。这通常不是问题,您存储简单支持变量的值,当控件被释放时它们不会变得无效。顺便说一句,很容易测试,但如果您不确定,那么使用一个简单的类来存储需要保留的值并将其传递给 RunWorkerAsync() 总是安全的。
您需要处理工作线程因程序终止而被中止的风险。如果这种情况在写入文件时发生,那么文件将被损坏。您可以通过写入另一个文件来解决这个问题。并使用 File.Replace() 来交换它。一般来说,始终是替换文件时应使用的策略。
关于c# - 正在运行的BackgroundWorker的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22973922/