如何在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()填充被调用两次…
有谁能帮我一下吗
谢谢
将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();
}