-1

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

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

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

4

3 回答 3

1

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

Application.Run(f4)

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

于 2012-05-15T01:37:44.647 回答
0

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

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

于 2012-05-15T01:04:28.753 回答
0

ShowDialog确实会泵送消息,因此它在技术上可以在单独的线程上工作,而无需专用的消息循环。但是,您当前拥有的内容看起来像是灾难的秘诀,因为该表单似乎包含对另一个表单的引用 viaf4.mainform = this并且它可能正在尝试访问它。如果不使用一堆InvokeorBeginInvoke调用乱扔垃圾(我的意思是字面意思)你的代码,你根本无法做到这一点。

此外,在主 UI 线程以外的线程上运行 UI 表单通常效果不佳。您可能会遇到一些晦涩难懂的问题。例如,由于有两个 UI 线程在运行,因此可以打开 2 个活动模式对话框。一个可能隐藏在另一个后面,最终用户看不到它。这也是为什么通常不建议使用多个 UI 线程的原因。

我的建议是想办法让这个工作与单个 UI 线程一起工作。如果你这样做,你的生活会更简单。

于 2012-05-15T02:13:55.800 回答