2012-07-29 15 views
0

我在C#中的多线程应用程序的工作/。NET
我想每个线程创建其自己的形式,因此它可以访问它并显示其其表格中的信息没有任何问题
有没有办法做到那?
我试过Application.Run(新的MyForm()),但问题是这个函数阻止执行,我的线程无法完成它的工作。多个GUI一个foreach线程在.net中?

+1

做form.Show()代替。他们不在单独的线程中,但他们也不阻止。在不同的线程中产生太多的表单似乎并不是一个好主意。 – nawfal 2012-07-29 22:31:46

+0

为什么它不是一个好主意?我认为这比从所有主题更新一个gui更好 – 2012-07-29 22:35:29

回答

1

您可以使用您的窗体的Show方法表现出来,即使你想显示在Dialog形式你可以使用ShowDialog方法的形式,对话将在其他形式的顶部。

+1

大概每个线程都会有一些信息,它会在它自己的窗口中实时显示。所以模态形式不会起作用;他们会阻止。 – 2012-07-29 22:39:43

+0

@RobertHarvey - 你确定吗?携带发布到其他表单的数据的消息会发生什么情况?好的,他们没有专注,但是他们应该仍然能够处理不需要专注的张贴消息? – 2012-07-29 23:24:58

0

您需要使用Show方法从其线程中打开窗体,并且不能在不同线程的窗体之间链接,如来自不同线程的MDI父窗口和子窗体。 顺便说一下,你可以在主要的GUI线程中打开所有的窗体,并且使用invoke从其他线程显示数据而没有任何问题,我认为这种方法更好。看这里:http://msdn.microsoft.com/en-us/library/ms951089.aspx

2

这是设计。线程一次只能做一件事,所以如果你的代码运行在该线程上的UI将被阻塞,并且如果你想运行一个UI,你将不得不使用一些消息传递构造(例如计时器)来获取你的工作完成了。

正确的方法确实是拥有一个UI线程,并让其他线程异步发布进度消息以便在UI上显示(例如,在窗体上使用BeginInvoke,这可以安全地从其他线程调用)。

+0

您也可以使用一个'BackgroundWorker',它具有一种安全的方式将状态信息封送回表单。 – 2012-07-29 22:42:03

+0

对。我在.NET 1.1中完成了这种工作,但当时没有BackgroundWorker,我总是忘记它。在此期间,我主要进行服务器开发,这使我免于使用线程绑定的窗口消息。 – Lucero 2012-07-29 22:43:39