zoukankan      html  css  js  c++  java
  • Winform中设置BackgroundWorker在取消时关闭后台进程不生效-没有跳出循环

    场景

    Winform中设置BackgroundWorker在取消时关闭后台进程:

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103254728

    在以上流程中取消后台BackgroundWorker时如果是正常流程时会生效,但是会遇到以上情况

    就是执行到了DoWork的方法中的循环时,此循环执行时间很长,往往取消了后还会将当前循环执行完。

    所以为了彻底取消执行,应该在循环中就执行是否取消的检测,进而跳出循环或者说直接结束当前方法。

    注:

    博客主页:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    比如在下面的DoWork方法中

         private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                string errMsg = String.Empty;
                bool result = false;
                BackgroundWorker bgWorker = sender as BackgroundWorker;
                if ((bgWorker.CancellationPending == true))
                {
                    e.Cancel = true;
                    errMsg = "已取消导出";
                    result =  false;
                    return;
                }
                if (e.Cancel)
                {
                    errMsg = "已取消导出";
                    result = false;
                    return;
                }
    
                .....
    
                    if (this.radioButtonAll.Checked)
                    {
                        ExportExcelHelper excleHelper = new ExportExcelHelper();
                        result = excleHelper.exportExcelAll(this.pathTextBox.Text, this.nameTextBox.Text, sender, e, this.checkEdit_Autx.Checked, this.checkEdit_Bms.Checked, out errMsg, AutxDecimalNum, AuvxDecimalNum, BmsDecimalNum);
                    }

    虽然已经添加了是否已经取消的处理,但是在此方法中还有调用别的方法exportExcelAll,在别的方法exportExcelAll中有执行的循环的操作。

    所以要在当前方法中将sender 和e 作为参数传递给调用的方法。

    同时在方法exportExcelAll的最前面也要加上是否取消的处理

            public bool exportExcelAll(String filePath, String fileName, object sender, DoWorkEventArgs e, Boolean needAuxRecord, Boolean needBmsRecord, out string errMsg, int autxDecimalNum, int auvxDecimallNum, int bmsDecimalNum)
            {
                BackgroundWorker bgWorker = sender as BackgroundWorker;
                if ((bgWorker.CancellationPending == true))
                {
                    e.Cancel = true;
                    errMsg = "已取消导出";
                    return false;
                }
                if (e.Cancel)
                {
                    errMsg = "已取消导出";
                    return false;
                }
    
               .....
    
                   for (int i = 0; i < excelTotalCount; i++)
                    {
                        //BackgroundWorker bgWorker = sender as BackgroundWorker;
                        if ((bgWorker.CancellationPending == true))
                        {
                            e.Cancel = true;
                            errMsg = "已取消导出";
                            return false;
                        }
                        if (e.Cancel)
                        {
                            errMsg = "已取消导出";
                            return false;
                        }
                  }

    同理如果在exportExcelAll中有调用的其他的方法和循环也要添加是否取消的处理。

    然后在方法的循环中添加对取消的处理。

    因为为了防止后台继续执行,即为了不让其执行类似于循环这样的操作,所以应该在循环中进行监控是否取消。进而结束当前循环或者结束当前方法,一般是return  或者return false。

  • 相关阅读:
    Java实现 LeetCode 667 优美的排列 II(暴力)
    Java实现 LeetCode 665 非递减数列(暴力)
    Java实现 LeetCode 665 非递减数列(暴力)
    Java实现 LeetCode 665 非递减数列(暴力)
    Java实现洛谷 P1873 砍树(StreamTokenizer+IO+二分)
    PHP RESTful
    PHP 获取图像宽度与高度
    PHP imagecolorclosesthwb
    PHP imagecolorclosestalpha
    PHP imagecolorclosest
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12972576.html
Copyright © 2011-2022 走看看