从每个线程中打开新表单?

时间:2012-05-14 23:45:18

标签: c# multithreading

我正在使用以下代码在我的函数中打开一个新表单(即用户输入):

Form4 f4 = new Form4();
f4.mainform = this;
f4.get_Text(matchString);
f4.ShowDialog();

当没有线程时,它工作得很好,但是当我尝试在两个线程上运行该函数时,我只获得1个表单弹出窗口。如何调整它以便它支持多个线程?

3 个答案:

答案 0 :(得分:1)

您可以从任何线程打开表单,只需在新线程上启动消息循环,例如:

Application.Run(f4)

在表单关闭之前,Run方法不会返回。但是,它可能会导致问题,因此您需要小心并知道自己在做什么。除非真的很痛苦,否则我会尽快考虑重新设计你的代码以使其更加异步。例如,您可以创建一个事件处理程序方法来侦听表单的结束事件。

答案 1 :(得分:0)

WIN32消息泵在一个线程上运行 - GUI线程。只要.ShowDialog(),c#就会停止,直到用户关闭对话框。即使您使用.Show()来避免“停止并等待用户推送”,您仍然必须通过.Invoke() GUI线程处理GUI线程上的所有GUI事件。

支持多线程的方法是在备用线程上进行非GUI工作。

答案 2 :(得分:0)

ShowDialog会对消息进行抽取,因此技术上可以在单独的线程上工作而无需专用的消息循环。但是,您目前所拥有的内容看起来像是灾难的秘诀,因为该表单似乎通过f4.mainform = this保存对另一个表单的引用,并且可能是尝试访问它。如果没有乱扔垃圾(我的意思是字面意思)你的代码有一堆InvokeBeginInvoke来电,你根本无法做到这一点。

此外,在主UI线程以外的线程上运行UI表单通常不能很好地工作。您可能遇到一些模糊的问题。例如,由于将有两个UI线程在运行,因此可以打开2个活动模式对话框。一个可能隐藏在另一个后面,最终用户不会看到它。其中的原因是,通常不建议使用多个UI线程。

我的建议是找出一种方法,使用单个UI线程来完成这项工作。如果你这样做,你的生活会变得更加简单。