在我的应用程序中,我有一个主窗口,并在其中加载一个页面。当用户按下按钮时,此页面会执行一项长时间任务。我的问题是,当长时间的任务正在执行并且用户按下主窗口的关闭按钮时,应用程序似乎没有完成,因为我正在 VS2008 中调试它,并且我可以看到停止按钮突出显示。如果我想完成,我必须按停止按钮,应用程序不会在应用程序退出时自动停止调试。我认为 .NET 在应用程序退出时会自动停止后台工作程序,但在看到这种行为后我不确定。我尝试在卸载的事件页面中强制并取消后台工作人员,如下所示:
private void Page_Unloaded(object sender, RoutedEventArgs e)
{
// Is the Background Worker do some work?
if (My_BgWorker != null && My_BgWorker.IsBusy)
{
//If it supports cancellation, Cancel It
if (My_BgWorker.WorkerSupportsCancellation)
{
// Tell the Background Worker to stop working.
My_BgWorker.CancelAsync();
}
}
}
但没有成功。完成 CancelAsync() 后,几分钟后,我可以看到后台工作程序完成并引发 RunWorkerCompleted,我可以看到任务已完成,检查事件中的 e.Cancelled 参数,但在执行此事件后,应用程序继续而不退出,我已经不知道在做什么......
我将 WorkerSupportsCancellation 设置为 true 以支持一开始的取消。
我会感谢所有的答案。谢谢。
最佳答案
取消不是自动的,DoWork
事件处理程序中的代码需要通过检查 CancellationPending
属性的值来处理取消。调用 CancelAsync
不会中止线程,它只是将 CancellationPending
设置为 true...
例如:
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
while(!bgw.CancellationPending)
{
...
}
}
关于WPF 在应用程序退出时取消后台工作程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2523378/