c# - 正在运行的BackgroundWorker的处理

标签 c# winforms backgroundworker idisposable system.componentmodel

我在 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/

相关文章:

c# - JSON.net 将 C# 对象序列化为 JSON 问题

c# - 向 Windows 控制框添加项目

c# - 如何同时绑定(bind)到列表和子列表?

vb.net - 如何取消一个非迭代的BackGroundWorker

c# - 取消长操作

c# - 区域和子域路由

c# - 调整 WPF ListBox 选择框的大小

c# - Unity 无法识别 .NET Standard 2.0 引用

C# Windows 窗体 - 在控件外部单击后隐藏控件

c# - 帮助。我确实重用了BackgroundWorker。但该 worker 发生了很奇怪的行为