C# 停止后台工作程序

C# 停止后台工作程序,c#,.net,backgroundworker,C#,.net,Backgroundworker,我的应用程序使用后台工作程序在循环中执行一些工作。在每次循环迭代中,它都会检查取消挂起是否为真,如果为真,则会中断循环。好的,我的应用程序在循环的当前迭代完成后停止处理。问题是,我认为后台工作程序仍在运行-如果我再次单击按钮开始处理,我会收到一个错误,说明后台工作程序正忙 我本来打算处理worker,但它是在窗体运行时创建的,因此如果我处理了它,它就无法再次开始工作。我真正想做的是告诉后台工作人员,如果我单击“停止处理”按钮,它已完成,因此当我单击“开始”按钮时,它已准备好再次开始处理 我想试试

我的应用程序使用后台工作程序在循环中执行一些工作。在每次循环迭代中,它都会检查取消挂起是否为真,如果为真,则会中断循环。好的,我的应用程序在循环的当前迭代完成后停止处理。问题是,我认为后台工作程序仍在运行-如果我再次单击按钮开始处理,我会收到一个错误,说明后台工作程序正忙

我本来打算处理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;