我知道我可以从.NET启动一个新的工作线程。但是,我如何开始一个新的UI线程(如在MFC中)?如何在C#中启动一个UI线程
我不介意解决方案仅限于Windows盒子;我也希望解决方案是纯粹的.NET - 没有p /调用CreateThread等。
任何输入赞赏。
我知道我可以从.NET启动一个新的工作线程。但是,我如何开始一个新的UI线程(如在MFC中)?如何在C#中启动一个UI线程
我不介意解决方案仅限于Windows盒子;我也希望解决方案是纯粹的.NET - 没有p /调用CreateThread等。
任何输入赞赏。
使用Application.Run
- 它在当前线程中启动消息循环。开始时有重载或应用程序上下文,或者两者都没有。 (如果您想为新线程做到这一点,你需要创建线程,并以正常的方式启动它,并让它调用Application.Run
。)
如果您想创建一个新的线程能够创建和处理窗口句柄,则可以使用Thread对象上的SetApartmentState
函数并将其设置为STA
。您也可能需要在该线程的方法内部调用Application.Run
以创建您的消息循环。但是,请记住,您受到与其他任何线程中所使用的相同的跨线程no-no的限制(例如,您只能与创建线程的控制柄进行交互),所以你不能在你的其他UI线程上做任何事情而不切换上下文。
如果您有兴趣使用WPF,请查看MSDN的文章WPF's Threading Model,特别是“多窗口,多线程”部分。它详细介绍了你需要做什么来创建一个新的Dispatcher并在新线程上显示一个窗口。
你也可以这样做:
delegate void MyProcHandler(object param1, object param2);
MyForm.Invoke
(
new MyProcHandler(delegate(object param1, object param2)
{
// some code
}),
null,
null
);
如何Application.Run与ShowDialog的,这是我一直在使用之前的方法比较? – supercat 2011-08-25 15:47:59
@supercat:你是从非UI线程调用ShowDialog吗?我不确定在这种情况下的效果。 – 2011-08-25 16:11:37