如何在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()填充被调用两次...
任何人都可以帮助我
谢谢
答案 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();
}