当消息框退出时如何停止后台工作?

问题描述 投票:0回答:2

我正在用C#设计表单。我使用backgroundworker以我设计的形式执行操作。和messagebox.show()在事务结束时输出;我必须继续下一步。但是backgorundworker继续工作,尽管出现消息框。 Backgroundworker可能需要填写RunWorkerCompleted方法。但正如消息框所见,我不知道如何停止它的工作。你能帮助我吗?我认为;

if(MessageBox.Show("convert is okey")
{
    ....//but ı dont know what am ı writing here, too?
}

后台工作者是:

private void Button7_Click(object sender, EventArgs e) 
{ 
   backgroundWorker1.RunWorkerAsync();      
   backgroundWorker1.WorkerReportsProgress = true; 
}

private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
        Convert(); backgroundWorker1.ReportProgress(i); 
    } 
    // Bitrate(); 
} // is do work

private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
}

private void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    progressBar1.Value = 0; 
}
c# backgroundworker messagebox
2个回答
0
投票

保留一个可同时由后台工作人员和UI代码访问的变量。简单起见,请将其保留为公共静态变量。

public class YourClass
{
   public static bool IsBackgroundProcessActive = true;
}

现在在使用消息框时,请更改该变量。

if(MessageBox.Show("convert is okey")
{
    yourClass.IsBackgroundProcessActive  = false;
}

现在,您需要让后台工作人员收听此变量。对于大多数常见情况,此后台工作人员将是一个具有简单过程的循环。因此,您可以设置循环条件以检查此变量,

private void YourBackgroundWorkerFunction()
{
    while(yourClass.IsBackgroundProcessActive)
    {
       // Your simple iterative task 
    }
}

对于后台工作程序不是简单循环的复杂情况,可以使用异常来停止线程。对于这种情况,写一个简单的函数为,

private void MarkAsSafeToStop()
{
    if(!yourClass.IsBackgroundProcessActive)
    {
        throw new OperationCancelledException();
    }
}

然后在后台工作程序功能的多个位置使用此功能。然后,只要在单击消息框后达到此功能,后台工作程序就会异常停止。

ie

private void YourBackgroundWorkerFunction()
{
   // Some code
   MarkAsSafeToStop();
   // Some other code
   MarkAsSafeToStop();
   // and so on.
}

0
投票

您可以使用后台工作程序内置的内置取消机制。

https://www.wpf-tutorial.com/misc/cancelling-the-backgroundworker/

© www.soinside.com 2019 - 2024. All rights reserved.