我有这样的问题,我有两个Winforms,f1和f2。
f1将在按钮单击时启动循环,此循环检查条件并决定调用另一个形式为f2或不是。
问题是,循环可能多次调用f2,因此每次调用另一个形式f2时,第一个形式f1应该暂停执行。
所以,我解决了这个问题,我使用了 backgroundWorker + AutoResetEvent 。我将backgroundWorker放在第一个表单中,在DoWork事件处理程序中,我调用了 f2.Show() 然后我在AutoResetEvent上调用了 WaitOne ,让它成为A。
在另一种形式“f2”中,在退出按钮上,我在同一个A上调用设置。
但是,不幸的是f2在f1中单击该按钮时被冻结了,我该怎么改变?
答案 0 :(得分:4)
为什么不简单地将表单F2作为对话框调用?
而不是处理线程和重置事件var f2 = new Form2();
// ...
f2.ShowDialog(this);
这样,F1上的过程只会在form2完成后继续。
答案 1 :(得分:2)
你不应该停止在WinForms中的GUI线程上执行,所以这可能是你做错了,(即调用WaitOne,它将阻止你的GUI)。
表单本身不会做任何“工作”。他们只是运行一个消息循环,等待输入和呈现UI。您应该将工作负载与 UI 分开,然后在单独的线程上运行它们。您已经在使用BackgroundWorker处理后台线程,因此唯一的变化是您不应该对GUI线程执行任何阻止操作。
事实上,也许你的解决方案是使用f2.ShowDialog而不是f2.Show。 ShowDialog将一直等到表单被解除,但是以一种允许UI继续发送消息的方式。
除此之外,我们需要看一些代码来指导您。