Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在CancelAsync()请求backgroundworker之后,将CancellationPending设置为false_C#_Winforms_Backgroundworker - Fatal编程技术网

C# 在CancelAsync()请求backgroundworker之后,将CancellationPending设置为false

C# 在CancelAsync()请求backgroundworker之后,将CancellationPending设置为false,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,A类包含两个事件按钮开始单击,按钮取消单击。当启动按钮被选中时,单击BackgroundWorker启动流程 现在,当单击“取消”按钮时,会弹出一个消息框,如果用户单击“是”按钮,则会停止处理,如果用户单击“否”按钮,则会恢复处理 现在问题是在bgw.CancelAsync()CancellationPending变为true之后,现在我想在用户单击messagebox中的“否”后将CancellationPending设为false 有谁知道我该怎么做或其他解决方案吗 public parti

A类包含两个事件
按钮开始单击
按钮取消单击
。当启动按钮被选中时,单击
BackgroundWorker
启动流程

现在,当单击“取消”按钮时,会弹出一个消息框,如果用户单击“是”按钮,则会停止处理,如果用户单击“否”按钮,则会恢复处理

现在问题是在
bgw.CancelAsync()
CancellationPending
变为true之后,现在我想在用户单击messagebox中的“否”后将
CancellationPending
设为false

有谁知道我该怎么做或其他解决方案吗

public partial class A : Form
{
  private BackgroundWorker bgw;

  private void buttonCancel_Click(object sender, EventArgs e)
  {
       // Make cancel request
       if (bgw != null)
       {
           bgw.CancelAsync();
       }
  }

  private void buttonStart_Click(object sender, EventArgs e)
  {
    B objB=new B();
    bgw = new BackgroundWorker
            {
                WorkerReportsProgress = true,
                WorkerSupportsCancellation = true
            };
    bgw.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged);
    bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BackgroundWorker_RunWorkerCompleted);
    bgw.DoWork += new DoWorkEventHandler(objB.Work);            
  }
}

class B
{
      private bool WantToCancle()
      {
           DialogResult Result= MessageBox.Show("Are you want to cancel?", "Cancel ?",MessageBoxButtons.YesNo, MessageBoxIcon.Warning);

           return Result == DialogResult.Yes ? true : false;
      }
      public void Work(object sender, DoWorkEventArgs e)
      {
           While(condition...)
           {  
              ......
              if(((BackgroundWorker)sender).CancellationPending)
              {
                  if(WantToCancle()){return;}
              }  
          }  
     }
 }

我需要做的就是调用

  private bool WantToCancle()
  {
        DialogResult Result = DialogResult.Yes;

        Application.OpenForms["form name"].Invoke((Func<DialogResult>)(() =>
        Result =MessageBox.Show("Are you want to cancel?", "Cancel ?",MessageBoxButtons.YesNo, MessageBoxIcon.Warning);

        return Result == DialogResult.Yes ? true : false;
   }
private bool WantToCancle()
{
DialogResult=DialogResult.Yes;
Application.OpenForms[“表单名称”].Invoke((Func)(()=>
结果=MessageBox.Show(“是否要取消?”,“取消?”,MessageBoxButtons.YesNo,MessageBoxIcon.Warning);
返回结果==DialogResult.Yes?true:false;
}

我不明白这个问题。为什么不在调用
CancelAsync()
之前,将
WantToCancle()
[sic]方法调用放在
单击事件处理程序中?事实上,你必须这样做……你不能“取消”一个被取消的工作人员。但为什么你没有想到?是什么阻止你这样做?在你的建议消息框中,将打开,但后台仍在处理其他代码,但我想停止后台工作人员的处理过程,这就是为什么它存在@peterdunhoi不同意你的设计目标。如果有提示询问用户是否他们真的想取消该操作,那么为什么要中断该操作呢?为什么不让它继续进行,直到您确定用户希望取消它?但无论如何,您不能取消工作进程,然后取消它。如果您希望它在等待用户输入时暂停,您需要为此添加自己的机制(例如信号量或等待句柄)。举个例子,如果应用程序像复制粘贴系统,那么我必须向用户询问取消进程@彼得多尼奥。