在我们基于 .NET Framework 的应用程序中,我们使用 BackgroundWorker 保存了一个巨大的文件保持 UI 响应。当我们关闭它时,我们不想停止后台工作(默认行为)并截断文件。
与此相比,是否存在更优雅的等待其完成的方式?
while (this.backgroundWorker1.IsBusy)
{
// Keep UI messages moving, so the form remains
// responsive during the asynchronous operation.
Application.DoEvents();
}
谢谢。
编辑:基本上,我们正在努力实现的是看到应用程序消失并继续看到一个进程事件(在 Task Manager 中)直到后台工作完成。
您可以使用 WaitHandle
来保持与工作线程的同步。
private ManualResetEvent _canExit = new ManualResetEvent(true);
private DoBackgroundWork()
{
_canExit.Reset();
backgroundWorker1.RunWorkerAsync(_canExit);
}
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
// This foreground thread will keep the process alive but allow UI thread to end.
new Thread(()=>
{
_canExit.WaitOne();
_canExit.Dispose();
}).Start();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
ManualResetEvent mre = (ManualResetEvent )e.Argument;
// do your work.
mre.Set();
}
如果您有多个后台线程等待,请管理一个 WaitHanlde
集合并使用 WaitHandle.WaitAll
来防止进程退出。
我是一名优秀的程序员,十分优秀!