C# 在CancelAsync()请求backgroundworker之后,将CancellationPending设置为false
A类包含两个事件C# 在CancelAsync()请求backgroundworker之后,将CancellationPending设置为false,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,A类包含两个事件按钮开始单击,按钮取消单击。当启动按钮被选中时,单击BackgroundWorker启动流程 现在,当单击“取消”按钮时,会弹出一个消息框,如果用户单击“是”按钮,则会停止处理,如果用户单击“否”按钮,则会恢复处理 现在问题是在bgw.CancelAsync()CancellationPending变为true之后,现在我想在用户单击messagebox中的“否”后将CancellationPending设为false 有谁知道我该怎么做或其他解决方案吗 public parti
按钮开始单击
,按钮取消单击
。当启动按钮被选中时,单击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不同意你的设计目标。如果有提示询问用户是否他们真的想取消该操作,那么为什么要中断该操作呢?为什么不让它继续进行,直到您确定用户希望取消它?但无论如何,您不能取消工作进程,然后取消它。如果您希望它在等待用户输入时暂停,您需要为此添加自己的机制(例如信号量或等待句柄)。举个例子,如果应用程序像复制粘贴系统,那么我必须向用户询问取消进程@彼得多尼奥。