C# 停止后台工作程序
我的应用程序使用后台工作程序在循环中执行一些工作。在每次循环迭代中,它都会检查取消挂起是否为真,如果为真,则会中断循环。好的,我的应用程序在循环的当前迭代完成后停止处理。问题是,我认为后台工作程序仍在运行-如果我再次单击按钮开始处理,我会收到一个错误,说明后台工作程序正忙 我本来打算处理worker,但它是在窗体运行时创建的,因此如果我处理了它,它就无法再次开始工作。我真正想做的是告诉后台工作人员,如果我单击“停止处理”按钮,它已完成,因此当我单击“开始”按钮时,它已准备好再次开始处理 我想试试这个:C# 停止后台工作程序,c#,.net,backgroundworker,C#,.net,Backgroundworker,我的应用程序使用后台工作程序在循环中执行一些工作。在每次循环迭代中,它都会检查取消挂起是否为真,如果为真,则会中断循环。好的,我的应用程序在循环的当前迭代完成后停止处理。问题是,我认为后台工作程序仍在运行-如果我再次单击按钮开始处理,我会收到一个错误,说明后台工作程序正忙 我本来打算处理worker,但它是在窗体运行时创建的,因此如果我处理了它,它就无法再次开始工作。我真正想做的是告诉后台工作人员,如果我单击“停止处理”按钮,它已完成,因此当我单击“开始”按钮时,它已准备好再次开始处理 我想试试
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!backgroundWorker1.CancellationPending)
{
// Start processing in a background thread so the GUI remains responsive,
// pass in the name of the text file produced by
// PFDR FilenameLogic(txtLetterType.Text);
}
}
创建工作进程时,请将
worker.worker支持扫描单元设置为true
。现在在DoWork
处理程序中,您必须定期(最常见的是在某些循环开始时等)检查worker.CancellationPending
-如果为true,则设置e.Cancel=true代码>(以便您可以区分完成和取消)、清理和退出(return;
)。现在,您的取消按钮可以调用worker.CancelAsync()代码>,它会正常工作。与Marc Gravell的答案相同,但你似乎不明白
是否将e.cancel设置为true
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
for (int i = 1; i <= 10; i++)
{
if (worker.CancellationPending == true)
{
e.Cancel = true;
break;
}
else
{
// Perform a time consuming operation and report progress.
System.Threading.Thread.Sleep(500);
worker.ReportProgress(i * 10);
}
}
}
private void backgroundWorker1\u DoWork(对象发送方,DoWorkEventArgs e)
{
BackgroundWorker worker=发件人作为BackgroundWorker;
对于(int i=1;i我似乎已经解决了这个错误-在我输入的Backgroundworker DoWork方法中,CancelPending不是真的,当它为真时,我设置e.Cancel=true,它现在似乎可以正常工作了!我几乎找不到一个好方法来通过停止按钮取消Backgroundworker:
我的应用程序看起来像这样,两个按钮和一个进度条:
按下停止按钮后,看起来如下所示:
对于启动按钮单击方法,代码检查BGW是否忙。如果不忙,则启动BGW:
private void btnStart_Click(object sender, EventArgs e)
{
//BGW
if (!backgroundWorker1.IsBusy)
{
backgroundWorker1.RunWorkerAsync();
}
}
stop按钮调用以下方法,该方法将标志CancellationPending设置为true:
private void btnStop_Click(object sender, EventArgs e)
{
backgroundWorker1.CancelAsync();
}
此标志可用于BackgrounderWorkr1\u DoWork方法,该方法负责处理高耗时的函数:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
backgroundWorker1.ReportProgress(i);
Thread.Sleep(100);
if (backgroundWorker1.CancellationPending && backgroundWorker1.IsBusy)
{
e.Cancel = true;
return;
}
}
}
额外信息:
别忘了设置这些Backgroundworker标志:
//Set WorkerReportsProgress true - otherwise no ProgressChanged active
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
如果这个小教程有帮助-->竖起拇指您是否正在等待启用开始处理按钮的RunWorkerCompleted
事件?“我有它,以便在每次循环迭代时,它检查取消挂起是否为真,如果为真,则中断循环。”当取消挂起为true时,您是否将DoWorkedEventTargets e Parameters Cancel属性设置为true?=>e.Cancel=true;那么我如何定期检查状态?我将使用此选项:private void backgroundWorker1\u DoWork(对象发送方,DoWorkedEventTargets e){while(!backgroundWorker1.CancelationPending){//在后台线程中开始处理,以便GUI保持响应,传入PFDR FilenameLogic(txtLetterType.text)生成的文本文件名;}但是它会起作用吗?@user1779064没有你的处理器的具体例子,这很难回答。但是在它被取消之前不要循环-否则它永远不会正常完成(如果你明白我的意思的话)。通常,工人正在处理已知数量的工作-通常涉及某种类型的for
或foreach
循环-这些循环的顶部是检查取消的理想位置。
//Set WorkerReportsProgress true - otherwise no ProgressChanged active
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;