如何在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()填充已被调用两次…

谁能帮我吗

谢谢

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

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

添加Fill(); 到你的bgwLoadFile_DoWork并从btnFill_Click删除它

只是注意你可能想要调用你的picLoading.SendToBack(); 在’其他’之外,如果你错误或取消它将留在那里。