none
BackgroundWorker类每次调用调用RunWorkerAsync 方法都开新线程吗? RRS feed

  • 问题

  • BackgroundWorker类执行完DoWork事件之后占用的那个线程释放吗?换言之,每次调用RunWorkerAsync 方法时都在new一个新线程吗
    2012年9月20日 13:39

答案

  • 你好!

    会自动释放 ,RunWorkerAsync 会开启一个线程执行 DoWork 事件中的代码块  RunWorkerCompleted 表示 DoWork 事件代码块已执行完成。


    知识改变命运,奋斗成就人生!

    2012年9月21日 3:15
    版主

全部回复

  • 你好!

    会自动释放 ,RunWorkerAsync 会开启一个线程执行 DoWork 事件中的代码块  RunWorkerCompleted 表示 DoWork 事件代码块已执行完成。


    知识改变命运,奋斗成就人生!

    2012年9月21日 3:15
    版主
  • BackgroundWorker类执行完DoWork事件之后占用的那个线程释放吗?换言之,每次调用RunWorkerAsync 方法时都在new一个新线程吗

    不会,因为你不可能重复调用。因为RunWorkAsync会判断当前是否启动了异步——如果启动了则不会再次启动,反而抛出异常了。详情证明看反编译代码:

    public void RunWorkerAsync(object argument)
    {
        if (!this.isRunning)
        {
            this.isRunning = true;
            this.cancellationPending = false;
            this.asyncOperation = AsyncOperationManager.CreateOperation(null);
            this.threadStart.BeginInvoke(argument, null, null);
            return;
        }
        else
        {
            throw new InvalidOperationException(SR.GetString("BackgroundWorker_WorkerAlreadyRunning"));
        }
    }

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年9月21日 7:30
    版主
  • 我明白不可能重复调用。我的意思是,dowork里的代码块执行完毕之后backgroundworker占用的线程自动释放吗?
    2012年9月25日 12:46