使用form.ShowDialog()时,mainform中的线程不起作用

时间:2011-03-29 20:01:25

标签: c# winforms

我有一个表单我正在使用form.showDialog()显示,并且在主表单中我有一个每隔x秒发送一条消息的线程。我注意到,当我在窗口中打开我使用ShowDialog打开的新表单时,线程无法运行。即使使用ShowDialog,如何让它继续运行?

代码:

codeshowAllScriptsWindow window = new showAllScriptsWindow(this); 
window.Show();

并且在mainform中我有一个不断发送消息的线程但由于这个showdialog而被停止。请注意,当我使用show()时,它不会发生。

4 个答案:

答案 0 :(得分:4)

ShowDialog()是一个阻止调用。线程实际运行,它忙于为对话框抽取消息循环。这与程序主线程中发生的情况没有什么不同。

这样做是非常不明智的,对话框与您应用中的其他窗口没有Z顺序关系。一个经典的不幸是它可以在另一个窗口后面消失,但没有好的方法让用户找回它。使用Control.BeginInvoke在UI线程上创建对话框。这也确保您的线程保持“运行”。

答案 1 :(得分:2)

您正在显示的模式对话框中的消息泵被“窃取”。 您有两个选择:

  1. 不要使用模态对话框(使用formShow())
  2. 使用新线程完成工作并使用主线程进行UI。

答案 2 :(得分:1)

虽然乍一看似乎没有关系,但你可以看看这个question。您遇到的问题是form.showDialog()调用创建一个模式对话框,停止该线程上的代码进程。如果您旋转另一个线程并触发该调用,则第一个线程将在对话框显示时继续运行。

答案 3 :(得分:0)

使用System.Threading.Timer而不是System.Windows.Form.Timer。