Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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#Can';t关闭后台工作人员创建的窗体_C#_Multithreading_Forms_Backgroundworker - Fatal编程技术网

C#Can';t关闭后台工作人员创建的窗体

C#Can';t关闭后台工作人员创建的窗体,c#,multithreading,forms,backgroundworker,C#,Multithreading,Forms,Backgroundworker,我的Backgroundworker加载了一个新的“弹出”表单,但是我如何终止后台工作人员和新创建的表单 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BussyForm bussyForm = new BussyForm(); bussyForm.ShowDialog(); } 这没有效果: backgroundWorker1.Dispose(); backgroundWor

我的Backgroundworker加载了一个新的“弹出”表单,但是我如何终止后台工作人员和新创建的表单

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BussyForm bussyForm = new BussyForm();
    bussyForm.ShowDialog();
}
这没有效果:

backgroundWorker1.Dispose();
backgroundWorker1.CancelAsync();
backgroundWorker1 = null;

CancelAsync
实际上不会中止线程或类似的操作。它向工作线程发送一条消息,即应通过
BackgroundWorker.CancellationPending
取消工作。在后台运行的DoWork委托必须定期检查此属性并自行处理取消


调用
bussyForm.ShowDialog()因此您需要手动关闭此表单。

您不应该从非UI线程显示表单。您应该只有一个UI线程,并且只有它才能访问所有用户界面控件。非UI线程根本不应该访问UI元素

您应该从UI线程显示给定的繁忙弹出窗口

BackgroundWorker
请求取消或处理它不会关闭表单,也不会强制线程停止执行,这就是表单保持打开状态的原因

相反,在启动后台工作程序时,只需从UI线程显示弹出窗口,并在表单上显示BGW已完成的事件调用
关闭

private void button1_Click(object sender, EventArgs args)
{
    BusyForm busyForm = new BusyForm();

    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += worker_DoWork;
    worker.RunWorkerCompleted += (_, e) => { busyForm.Close(); };
    worker.RunWorkerAsync();

    busyForm.ShowDialog();
}

信息和。您是否尝试backgroundWorker1.CancellationPending?问题是我有两个UI线程,所以我返回到一个,现在它可以正常工作了。。我理解。我需要重新考虑我的设计。谢谢你的代码!