C# 处理正在运行的后台工作人员

C# 处理正在运行的后台工作人员,c#,winforms,backgroundworker,idisposable,system.componentmodel,C#,Winforms,Backgroundworker,Idisposable,System.componentmodel,关于Windows窗体应用程序中BackgroundWorker的处理,我已经看到了很多这样的问题,而且似乎大家一致认为在大多数情况下不需要手动处理它们。然而,我有一个关于如何处理BackgroundWorker实际运行时正在处理的UserComponent的问题。(IsBusy返回true)是否应以任何特定方式处理此情况 例如,我有一个用户控件(类似于面板的对象),用户可以输入设置信息。它包含一个BackgroundWorker,用于保存用户的配置。当面板失去焦点(离开事件)时,如果Backg

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


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

视情况而定,我们无法查看您的代码。首先,您不太可能实现CancelAsync(),所以不必为此费心。在Dispose()方法中旋转直到IsBusy返回false是一个选项,但是要小心死锁。当您为RunWorkerCompleted实现一个事件处理程序时,您肯定会得到一个。你不太可能有,所以旋转应该没问题

明智的做法是让它运行。用户会很高兴的。有必要采取一些预防措施:

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

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


视情况而定,我们看不到您的代码。首先,您不太可能实现CancelAsync(),所以不必为此费心。在Dispose()方法中旋转直到IsBusy返回false是一个选项,但是要小心死锁。当您为RunWorkerCompleted实现一个事件处理程序时,您肯定会得到一个。你不太可能有,所以旋转应该没问题

明智的做法是让它运行。用户会很高兴的。有必要采取一些预防措施:

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

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


旋转的僵局是我所害怕的,这也是促使我提出这个问题的原因。如果配置文件没有损坏,UI类中的数据在写入配置文件后实际上不需要保留,因为如果关闭后再次访问该面板,它将被重新读取以再次填充该面板。我给出了一个具体的建议来避免它,我建议您使用它。易于测试,只需关闭主窗口并将焦点放在控件上。这会触发Leave,然后是Dispose()。把线程。睡眠(3000)在嫁妆,以确保。我肯定会;只是提供一些背景资料。这可以安全地放置在RunWorkerCompleted处理程序中,对吗?或者需要在dispose方法中启动它吗?不,在dispose()中旋转。正如我提到的,如果实现了RunWorkerCompleted,就会死锁。我必须说,你没有发布你的代码,这使这不必要的困难。请结束你的问题。请原谅我要求澄清,不必粗鲁。我觉得这个问题很一般,不需要SSCCE,对不起。旋转的僵局是我害怕的,这就是促使我问这个问题的原因。如果配置文件没有损坏,UI类中的数据在写入配置文件后实际上不需要保留,因为如果关闭后再次访问该面板,它将被重新读取以再次填充该面板。我给出了一个具体的建议来避免它,我建议您使用它。易于测试,只需关闭主窗口并将焦点放在控件上。这会触发Leave,然后是Dispose()。把线程。睡眠(3000)在嫁妆,以确保。我肯定会;只是提供一些背景资料。这可以安全地放置在RunWorkerCompleted处理程序中,对吗?或者需要在dispose方法中启动它吗?不,在dispose()中旋转。正如我提到的,如果实现了RunWorkerCompleted,就会死锁。我必须说,你没有发布你的代码,这使这不必要的困难。请结束你的问题。请原谅我要求澄清,不必粗鲁。我觉得这个问题很笼统,不需要SSCCE,对不起。