我在解决如何在单独的UI线程中创建winform时遇到问题,我讨论过here。如何在线程中打开窗体并强制其保持打开状态
在试图找出这个我写了下面的简单测试程序。我只是想让它在一个名为“UI线程”的单独线程上打开一个表单,并且只要表单处于打开状态,允许用户与表单交互(旋转就是作弊),就保持线程运行。我明白为什么下面的失败和线程立即关闭,但我不知道我应该做些什么来解决它。
using System;
using System.Windows.Forms;
using System.Threading;
namespace UIThreadMarshalling {
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var tt = new ThreadTest();
ThreadStart ts = new ThreadStart(tt.StartUiThread);
Thread t = new Thread(ts);
t.Name = "UI Thread";
t.Start();
Thread.Sleep(new TimeSpan(0, 0, 10));
}
}
public class ThreadTest {
Form _form;
public ThreadTest() {
}
public void StartUiThread() {
_form = new Form1();
_form.Show();
}
}
}
是的,这只是微软未能正确地思考除了单个对话和单线程之外的任何事情。正如下面的解决方案所述,您可以启动一个单独的消息泵,但没有方便的方式从GUI线程启动它,因此无法将第二个窗体作为非模态对话框执行。 – 2012-07-18 23:24:17
公平地说,问题出自4年前,关于一个12岁的技术:) – 2012-11-20 21:13:33
是的,我知道,但抛开这个事实,甚至12年前人们想要这个,甚至没有看我会打赌一大笔钱MS的任何修订/新API都没有改变这种情况。 – 2012-11-22 04:22:26