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。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道流氓气质

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值