使用BackgroundWorker控件,有2个按钮buttonBegin和buttonCancel。
其他都正常,只是在用buttonBegin开始运行,然后点击buttonCancel取消后,到这里都正常。
可当再次点击buttonBegin时,就报错说:
“此 BackgroundWorker 当前正忙,无法同时运行多个任务。”查过资料,说是:this.backgroundWorker1.CancelAsync()只是将CancellationPending设置为true,并没有终止进程。
我现在想做的是,取消后,重新点击buttonBegin会重新运行。
感觉应该在buttonCancel_Click后面增加个终止该backgroundWorker1的方法,可查了半天也没找到。
代码如下:
 private void buttonBegin_Click(object sender, EventArgs e)
        {
            string[] pramlist = { "0"};
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
            backgroundWorker1.RunWorkerAsync(pramlist);
        }        private void buttonCancel_Click(object sender, EventArgs e)
        {
            this.backgroundWorker1.CancelAsync();
            buttonCancel.Enabled = false;
        }        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            string[] pramlist = (string[])e.Argument;
            e.Result = DownLoad(worker, e, pramlist);
        }        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {    
            this.progressBar1.Value = e.ProgressPercentage;
            labelMsg.Text = string.Format("下载中{0}%,{1}", e.ProgressPercentage, e.UserState.ToString());
        }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.Message);
            }
            else if (e.Cancelled)
            {
                labelMsg.Text = "下载被取消!";
            }
            else
            {
                this.progressBar1.Value = 0;
                labelMsg.Text = bool.Parse(e.Result.ToString()) ? "下载成功!" : "下载失败!";
            }
           buttonCancel.Enabled = false;
        }
        private bool DownLoad(BackgroundWorker worker, DoWorkEventArgs e, string[] pramlist)
        {
            for (int i = 0; i < 100; i++)
            {
                System.Threading.Thread.Sleep(1000);                worker.ReportProgress(i, "下载开始");
            }
          
            return true;
        }

 
 

解决方案 »

  1.  
  2. 别用控件,你直接用class,每次用之前new个新的对象即可。
  3. CancelAsync之后,BackgroundWorker.CancellationPending = true
    你要自己处理,具体如下:private bool DownLoad(BackgroundWorker worker, DoWorkEventArgs e, string[] pramlist)
            {
                for (int i = 0; i < 100; i++)
                {
                     if(worker.CancellationPending)
                    {
                       return false;
                    }        
                    System.Threading.Thread.Sleep(1000);                worker.ReportProgress(i, "下载开始");
                }
              
                return true;
            }
    其次Begin加IsBusy判断
    private void buttonBegin_Click(object sender, EventArgs e)
            {
                 if(backgroundWorker1.IsBusy)
                {
                    return;
                }
                string[] pramlist = { "0"};            backgroundWorker1.WorkerReportsProgress = true;
                backgroundWorker1.WorkerSupportsCancellation = true;
                backgroundWorker1.RunWorkerAsync(pramlist);
            }
  4. 需要在DoWork判断是否已经取消了,如果取消了,需要返回 
    backgroundworker有IsBusy属性,直接检测
  5. 报错:此 BackgroundWorker 当前正忙,无法同时运行多个任务

    CancelAsync之后,BackgroundWorker.CancellationPending = true
    你要自己处理,具体如下:

    private bool DownLoad(BackgroundWorker worker, DoWorkEventArgs e, string[] pramlist)
    {
    for (int i = 0; i < 100; i++)
    {
    if(worker.CancellationPending)
    {
    return false;
    }
    System.Threading.Thread.Sleep(1000); worker.ReportProgress(i, "下载开始");
    } return true;
    }

    其次Begin加IsBusy判断

    private void buttonBegin_Click(object sender, EventArgs e)
    {
    if(backgroundWorker1.IsBusy)
    {
    return;
    }
    string[] pramlist = { "0"}; backgroundWorker1.WorkerReportsProgress = true;
    backgroundWorker1.WorkerSupportsCancellation = true;
    backgroundWorker1.RunWorkerAsync(pramlist);
    }

backgroundWorker取消后,重新开始就报错:此 BackgroundWorker 当前正忙,无法同时运行多个任务。的更多相关文章

  1. oracle报错:ORA-00054: 资源正忙,要求指定 NOWAIT

    ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源: --首先得到被锁对象的session_idselect session_id from v$locked_object; -- ...

  2. FastDFS整合nginx后,nginx一直报错

    FastDFS整合nginx后,nginx一直报错: 报错内容: [2018-06-11 09:41:21] ERROR - file: ../common/fdfs_http_shared.c, l ...

  3. 普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚

    普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚

  4. Django_重装系统后无法使用 sqlite 数据库报错:com.intellij.execution.ExecutionException: Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC

     重装系统后无法使用 sqlite 数据库报错 报错 : com.intellij.execution.ExecutionException: Exception in thread "ma ...

  5. 安装Python3后,centos使用yum报错

    题记 在之前的文章中我自定义安装了Python3,并且修改了默认的 Python软链,今天想搭建一个 ftp 服务器,使用命令的时候出现了一个错误: 问题 1.使用 yum 安装 ftp工具 yum ...

  6. Python3安装Celery模块后执行Celery命令报错

    1 Python3安装Celery模块后执行Celery命令报错 pip3 install celery # 安装正常,但是执行celery 命令的时候提示没有_ssl模块什么的 手动在Python解 ...

  7. Hadoop0.20.203.0在关机重启后,namenode启动报错(/dfs/name is in an inconsistent state)

    Hadoop0.20.203.0在关机重启后,namenode启动报错: 2011-10-21 05:22:20,504 INFO org.apache.hadoop.hdfs.server.comm ...

  8. Springboot项目 配置数据库连接属性后,启动项目报错

    Springboot项目 配置数据库连接属性后,启动项目报错,错误如下: 错误原因分析: 1.连接信息配置错误 当使用properties为配置文件时,如图所示,上面的 spring.datasour ...

  9. Maven 从svn下载后,pom.xml报错解决方案

    Multiple annotations found at this line: - Execution default-testResources of goal org.apache.maven. ...

随机推荐

  1. about gnu bash shell

    1 定义字符串不需要引号 var=NONE echo $var ==>NONE 2 支持基本的整数计算 a=1 b=2 echo $((a+b)) ==>3 必须用$(()),双括号的形式 ...

  2. 我的Java开发学习之旅------>使用Working Setst将Eclipse中的项目分类使项目一目了然

    今天发现Eclipse中若有太多的项目,杂七杂八的,看起来会非常的痛苦.今天请教公司的前辈学会了一个方法,在Eclipse中,当项目比较多的时候,我们可以用WorkingSet将这些项目分类,把相关连 ...

  3. python数据分析之Pandas:基本功能介绍

    Pandas有两个主要的数据结构:Series和DataFrame. Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签构成.来看下它的使用过程 In [1]: from  ...

  4. spring运行步骤

    Spring确实使你能通过最简单可行的解决的方法来解决你的问题. 而这是有有非常大价值的.同一时候他的源码的设计理念也受到非常多程序猿的追捧,简洁,易用.但是从哪着手研究Spring却是非常多新手头疼 ...

  5. SAP 已经有17个模块

    SAP模块清单: 传统五大郎: MM,SD,PP,FI 财务会计CO 管理会计 +QM 质量管理 (制造业用的不少)+ABAP.BASIS.BW BI商务智能的组件之一CRM 客户管理SRM 供应商管 ...

  6. ZOJ - 1504 Slots of Fun 【数学】

    题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1504 题意 给出一串字符串 里面的每个字符的位置 都按照题目的意 ...

  7. ES6中promise总结

    一.什么是ES6的Promise 讲太多也没有.直接在打印出来就好,console.dir(Promise) Promise 是一个构造函数,自身有all, reject, resolve 这几个眼熟 ...

  8. SDUT OJ 之 人活着系列之寻找最完美的人生

    人活着系列之寻找最完美的人生 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 也许,人活着就是要尝试人世间的酸甜苦辣,喜怒哀乐,经 ...

  9. 如何在VMware Workstation上安装CentOS_7

    1.首先打开VMware Workstation-文件-新建虚拟机 2.选择自定义向导,下一步. 3.由于我的软件版本比较高,不想太多硬件限制就选了版本11.也可以选择低一些版本的,这样兼容性会更好, ...

  10. cocos2d-x中CCScrollView纵向展示

    最近写CCScrollView遇到很多问题,样式是竖直的类似tableview,在此记录下: CCLayer* layer; 初始化scrollview内容器层 layer = CCLayer::cr ...