【发布时间】:2008-10-03 15:07:27
【问题描述】:
我仍然无法弄清楚如何在我讨论过的单独 UI 线程中创建 winforms 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 线程启动它,因此无法使第二个表单作为非模态对话框执行。
-
公平地说,这个问题是 4 年前的,关于一个 12 岁的技术:)
-
是的,我知道,但撇开 12 年前人们就想要这个的事实不谈,我敢打赌,MS 的任何修订/新 API 的情况都没有改变.
-
我认为这不公平,我从来没有深入研究过 WPF,但我所做的似乎并没有受到这些问题的影响(在很多方面 WPF 是一种更成熟的 UI 技术比 HTML)。我认为基于 javascript 的新 UI 可以在节点样式的事件循环上工作,所以我认为 ui 线程甚至不是问题。尽管有许多缺点,但微软的开发工具的发展方式确实值得称赞。
标签: .net winforms multithreading