如何在C#中使用BackgroundWorker

时间:2013-03-01 07:40:21

标签: c# backgroundworker

如何在C#中使用BackgroundWorker?

实际上我正在执行从fill()方法填写PDF表单的操作。将结果显示到pdfviewer需要更多时间,因此我决定使用backgroundworker显示“处理图像”,并尝试使用它但未能实现它

这是我的代码段:

        private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Invoke((MethodInvoker)delegate()
           {
               ???? 
           }); 
        }

        private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          if (e.Cancelled == true)
          {
          }
          else if (e.Error != null)
          {
          }
          else
          {
           picLoading.SendToBack();
          }
       }

单击按钮 FILL 时调用填充方法

private void btnFill_Click(object sender, EventArgs e)
        {
            if (btnFill.Text == "Fill")
            { 
                bgwLoadFile.RunWorkerAsync();
                picloading.BringToFront();

                Fill();
            }
我需要在DoWork方法中添加wat语句,如果我尝试添加FILL()填充被调用两次...

任何人都可以帮助我

谢谢

2 个答案:

答案 0 :(得分:5)

Fill();添加到bgwLoadFile_DoWork并将其从btnFill_Click

中删除

只是旁注,您可能希望在“其他”之外调用picLoading.SendToBack();,就好像您输入错误或取消它一样。

答案 1 :(得分:2)

所以让我们试着找到一些答案:

方法worker_DoWork()将在另一个线程中执行。通过在该方法this.Invoke()内调用,您将把调用传递回gui线程,这使得后台工作程序的使用无用。相反,在工作方法中,您必须调用需要一些时间并且不与gui 交互的方法。如果此被调用方法产生任何结果(例如,具有返回值),则应将此信息写入变量e.Result

方法worker_RunWorkerCompleted()将再次在gui线程中调用。允许你取结果并让它以某种方式与gui交互。由于这个事实,这个方法将在gui线程上执行,它应该非常简单(或快速),否则你的gui会再次冻结。

因此,鉴于这些信息,我们可以清理您的代码:

private void btnFill_Click(object sender, EventArgs e)
{
    if (btnFill.Text == "Fill")
    { 
        // Update the gui for the user
        // and start our long running task
        // (disable buttons etc, cause the
        // user is still able to click them!).
        picloading.BringToFront();
        bgwLoadFile.RunWorkerAsync();
    }
}

private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e)
{
    // Let's call the long running task
    // and wait for it's finish.
    Fill();
}

private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // We're back in gui thread.
    // So let us show some results to the user.
    if (e.Cancelled)
    {
        // To support cancellation, the long running
        // method has to check some kind of cancel
        // flag (boolean field) to allow fast exit of it.
        labelMessage.Text = "Operation was cancelled.";
    }
    else if (e.Error != null)
    {
        labelMessage.Text = e.Error.Message;
    }

    // Hide the picture to allow the user
    // to access the gui again.
    // (re-enable buttons again, etc.)
    picLoading.SendToBack();
}