如何在c#中使用BackgroundWorker

本文关键字:BackgroundWorker | 更新日期: 2023-09-27 18:01:45

如何在c#中使用BackgroundWorker ?

实际上,我正在执行从称为fill()的方法填充PDF-Form的操作。它需要更多的时间来显示结果到pdfviewer,所以我决定使用后台工作器显示一个"处理图像",并尝试使用它,但未能实现它

下面是我的代码片段:
        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方法中添加什么语句,如果我试图添加FILL()填充被调用两次…

有谁能帮我一下吗

谢谢

如何在c#中使用BackgroundWorker

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

只是一个旁注,你可能会想要调用你的picLoading.SendToBack();外面的'else',如果你出错或取消它会留在那里。

让我们试着寻找一些答案:

方法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();
}