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