C#: 两个窗体,一个调用另一个窗体

3
我有一个类似的问题,我有两个Winforms,f1和f2。
当点击按钮时,f1会启动一个循环,这个循环检查一个条件并决定是否调用另一个窗体f2。
问题是,循环可能会多次调用f2,因此每次调用另一个窗体f2时,第一个窗体f1都应该暂停执行。
所以,我这样解决了,我使用了backgroundWorker + AutoResetEvent。我将backgroundWorker放置在第一个窗体中,并在DoWork事件处理程序中调用f2.Show(),然后在AutoResetEvent上调用WaitOne。
在另一个窗体"f2"中,在退出按钮上,我调用相同的A上的Set。
但是,不幸的是,当在f1中单击该按钮时,f2会被冻结,我应该改变什么?

f1是否正在创建f2并等待f2完成?即关闭? - Aren
是的,f1正在创建f2,并等待它完成。 - Lisa
2个回答

4

不必处理线程和重置事件,为什么不直接将表单F2作为对话框调用呢?

var f2 = new Form2();
// ...
f2.ShowDialog(this);

这样,只有在完成表单2后,F1上的流程才会继续。


谢谢,我不知道对话框的事情。 :) - Lisa

2
在WinForms中,您不应该在GUI线程上停止执行,这可能是您出错的原因(即调用WaitOne,它会阻塞您的GUI)。
表单本身并没有做任何“工作”。它们只运行消息循环,等待输入和渲染UI。您应该将您的“工作负载”与您的“UI”分开,并在单独的线程上运行它们。您已经在使用BackgroundWorker背景线程,所以唯一的变化是您不应该在GUI线程上执行任何阻塞操作。
实际上,也许您的解决方案是使用f2.ShowDialog而不是f2.Show。ShowDialog将等待窗体关闭,但以允许UI继续处理消息的方式。
除此之外,我们需要看到一些代码来指导您进一步。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接