BackGroundWorker RunWorkerCompleted事件何时执行?

时间:2014-07-25 05:36:31

标签: c# winforms backgroundworker

我对BackGroundWorker RunWorkerCompleted事件执行时间感到困惑。 这是我的测试代码

private string hellow="hello";        
private void button1_Click(object sender, EventArgs e)
{
    bool createAndRunWorkResult = CreateAndRunWork();
    if (createAndRunWorkResult)
    {
        //Do something that need wait RunBackGroundWorkerCompleted execute here.
        //MessageBox.Show(hello);
    }
}

private bool CreateAndRunWork()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.RunWorkerAsync();
    return true;
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    //Nothing here;
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    hello="aloha";
}

我的设计工作流程是单击button1,然后在RunWorkerCompleted执行后执行某些操作。

但RunWorkerCompleted似乎位于方法堆栈的底部。换句话说:我在createAndRunWorkResult执行之前获得RunWorkerCompleted。令我困惑的是,如果我在button1_Click中取消注释MessageBox.Show(hello)MessageBox.Show(hello)将等到worker_RunWorkerCompleted执行完毕。但是,我仍然得到一个"你好"消息框而不是" aloha"。

我猜所有的UI操作都位于方法堆栈的RunWorkerCompleted下面。

但是,我不确定我的假设是否正确,是否有办法在RunWorkerCompleted被执行后强制执行某些操作?

2 个答案:

答案 0 :(得分:2)

问题是,一个backgroudnworker是另一个你不能等待的线程。 后台工作人员告诉你它何时完成了它的工作。 所以你的代码应该是这样的

private string hellow="hello";        
private void button1_Click(object sender, EventArgs e)
{
    bool createAndRunWorkResult = CreateAndRunWork();       
}

private bool CreateAndRunWork()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    worker.RunWorkerAsync();
    return true;
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    //Nothing here;
}

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    hellow="aloha";
        //Do something that need wait RunBackGroundWorkerCompleted execute here.
        //MessageBox.Show(hellow);
}

我建议您阅读:http://msdn.microsoft.com/en-us/library/ms173178%28v=vs.120%29.aspx  关于线程

答案 1 :(得分:1)

BackgroundWorker对象旨在简单地在不同的线程上运行一个函数,然后在完成后调用UI线程上的事件,因此在您的代码中,您应该在RunWorkerCompleted之后调用要运行的函数。 / p>

有3个步骤:

  1. 创建BackgroundWorker对象。
  2. 告诉BackgroundWorker对象在后台线程(DoWork函数)上运行什么任务。

  3. 告诉它在工作完成后在UI线程上运行什么功能(RunWorkerCompleted功能)

  4. 如果您在代码中编写函数调用

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                Test();//This is the code which in your case you want to run
            }
     void Test()
            {
                hello = "Hola";
                MessageBox.Show(hello);
            }
    

    您将收到HOLA消息,这是由于上面提到的第3步。希望这有帮助