2

如何在 C# 中使用 BackgroundWorker?

实际上,我正在执行从名为fill(). 将结果显示到 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时调用 Fill 方法

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

                Fill();
            }

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

谁能帮我吗

谢谢

4

2 回答 2

5

添加Fill();到您的bgwLoadFile_DoWork并从中删除btnFill_Click

只是一个旁注,您可能希望将您的picLoading.SendToBack();外部称为“其他”,就好像您出错或取消它会留在那里一样。

于 2013-03-01T07:43:20.857 回答
2

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

该方法worker_DoWork()将在另一个线程中执行。通过在该方法中调用,this.Invoke()您将把调用传递回 gui 线程,这使得后台工作人员的使用变得无用。相反,在 worker 方法中,您必须调用需要一些时间且不与 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();
}
于 2013-03-01T08:13:09.567 回答