c# - 应用程序停用时如何关闭 BackgroundWorker 线程?

标签 c# multithreading windows-phone-7 backgroundworker windows-phone-7.1

我使用 BackgroundWorker 创建线程,在循环中我每次检查 CancellationPending 是否为真,如下所示:

   public MainPage()
    {
        InitializeComponent();

        bw = new BackgroundWorker();
        bw.WorkerReportsProgress = true;
        bw.WorkerSupportsCancellation = true;
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    }

    private void ButtonStart_Click(object sender, RoutedEventArgs e)
    {
        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }
    }

    private void ButtonCancel_Click(object sender, RoutedEventArgs e)
    {
        if (bw.WorkerSupportsCancellation)
        {
            bw.CancelAsync();
        }
    }

    private void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        for (int i = 1; i <= 100; i++)
        {
            Debug.WriteLine("The tread is working");
            if (worker.CancellationPending)
            {
                e.Cancel = true;
                bw.CancelAsync();
                break;
            }
            else
            {

                System.Threading.Thread.Sleep(500);
                worker.ReportProgress(i);
            }
        }
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled)
        {
            tbProgress.Text = "Canceled";
        }
        else if (e.Error != null)
        {
            tbProgress.Text = "Error: " + e.Error.Message;
        }
        else
        {
            tbProgress.Text = "Done";
        } 
    }

    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        tbProgress.Text = e.ProgressPercentage.ToString() + "%";
    }

当应用程序被停用时,线程没有关闭,它被中止并发生异常。如何在应用程序停用时使用 BackgroundWorker 关闭线程?

最佳答案

当应用程序被停用时,除主 UI 线程之外的每个线程都会在其激活后立即抛出 ThreadAbortException。这似乎是“设计使然”,作为一种强制应用程序快速停止它们正在做的事情的方式。线程可以捕获 ThreadAbortException 并结束它们正在做的事情,但要注意 ThreadAbortException 将在 catch block 的末尾自动再次引发。 finally block 中的任何代码也将被执行。

对于您的具体问题,没有理由在应用程序停用时尝试取消 BackgroundWorker,因为 ThreadAbortException 会发生并且会有效地停止后台工作程序。如果你想在这种情况发生时做一些清理,你可以在 bw_DoWork 中捕获 ThreadAbortException,做你需要做的,然后让它死掉。

要让它在激活后再次启动,您必须重新启动后台工作程序,就像您第一次运行该应用程序时所做的那样。

关于c# - 应用程序停用时如何关闭 BackgroundWorker 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620098/

相关文章:

c# - ASP.NET Web App 比较不同硬件上的性能?

c# - Linq 缓慢具体化复杂查询

c# - 为什么 C# volatile 不保护读写重排序?

java - 线程 - 为什么我们在等待时使用 while(true)

silverlight - 尝试添加资源时出现未知解析器错误

c# - 具有连续滚动功能的 Leadtools PDF 查看器

c++ - 是否有一些方法可以使 c++ 类中的一个函数在不同的线程中运行

c# - 如何防止 AJAX 导航离开 WP7 中的 WebBrowser 控件中的页面

listbox - WP7 ListBox Items来填充ListBox的宽度

c# - 两种冒泡排序算法的区别