在弄清楚如何在我讨论了here的单独的UI线程中创建winform时,我仍然遇到问题。
为了弄清楚这一点,我编写了以下简单的测试程序。我只是希望它在名为“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();
}
}
}
最佳答案
在新线程上,调用传递窗体对象的Application.Run,这将使线程在窗口打开时运行其自己的消息循环。
然后,您可以在该线程上调用.Join以使您的主线程等待直到UI线程终止,或者使用类似的技巧来等待该线程完成。
例子:
public void StartUiThread()
{
using (Form1 _form = new Form1())
{
Application.Run(_form);
}
}
关于.net - 如何在线程中打开表单并强制其保持打开状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/167323/