WPF 在应用程序退出时取消后台工作程序

标签 wpf backgroundworker exit

在我的应用程序中,我有一个主窗口,并在其中加载一个页面。当用户按下按钮时,此页面会执行一项长时间任务。我的问题是,当长时间的任务正在执行并且用户按下主窗口的关闭按钮时,应用程序似乎没有完成,因为我正在 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/

相关文章:

c# - BackgroundWorker 异常处理

c# - 等待BackgroundWorker完成?

go - go中一个发生错误,关闭多个goroutine

c++ - exit() 和 abort() 有什么区别?

DataGridTemplateColumn 中的 WPF 数据绑定(bind) ComboBox

wpf - 带有鼠标悬停的集合 ItemTemplate 资源中的动态路径图标按钮

wpf - Windows Phone 8 Dispatcher.BeginInvoke 无法异步工作

c# - BackgroundWorker 奇怪的问题

mysql 退出 sp 与 if

WPF 计时器问题...无法获得正确的毫秒计时