C#:两种形式,一种是调用另一种形式

时间:2010-05-07 22:15:21

标签: c# winforms

我有这样的问题,我有两个Winforms,f1和f2。

f1将在按钮单击时启动循环,此循环检查条件并决定调用另一个形式为f2或不是。

问题是,循环可能多次调用f2,因此每次调用另一个形式f2时,第一个形式f1应该暂停执行

所以,我解决了这个问题,我使用了 backgroundWorker + AutoResetEvent 。我将backgroundWorker放在第一个表单中,在DoWork事件处理程序中,我调用了 f2.Show() 然后我在AutoResetEvent上调用了 WaitOne ,让它成为A。

在另一种形式“f2”中,在退出按钮上,我在同一个A上调用设置

但是,不幸的是f2在f1中单击该按钮时被冻结了,我该怎么改变?

2 个答案:

答案 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继续发送消息的方式。

除此之外,我们需要看一些代码来指导您。