2009-04-13 181 views
8

我知道我可以从.NET启动一个新的工作线程。但是,我如何开始一个新的UI线程(如在MFC中)?如何在C#中启动一个UI线程

我不介意解决方案仅限于Windows盒子;我也希望解决方案是纯粹的.NET - 没有p /调用CreateThread等。

任何输入赞赏。

回答

24

使用Application.Run - 它在当前线程中启动消息循环。开始时有重载或应用程序上下文,或者两者都没有。 (如果您想为线程做到这一点,你需要创建线程,并以正常的方式启动它,并让它调用Application.Run。)

+0

如何Application.Run与ShowDialog的,这是我一直在使用之前的方法比较? – supercat 2011-08-25 15:47:59

+0

@supercat:你是从非UI线程调用ShowDialog吗?我不确定在这种情况下的效果。 – 2011-08-25 16:11:37

2

如果您想创建一个新的线程能够创建和处理窗口句柄,则可以使用Thread对象上的SetApartmentState函数并将其设置为STA。您也可能需要在该线程的方法内部调用Application.Run以创建您的消息循环。但是,请记住,您受到与其他任何线程中所使用的相同的跨线程no-no的限制(例如,您只能与创建线程的控制柄进行交互),所以你不能在你的其他UI线程上做任何事情而不切换上下文。

4

如果您有兴趣使用WPF,请查看MSDN的文章WPF's Threading Model,特别是“多窗口,多线程”部分。它详细介绍了你需要做什么来创建一个新的Dispatcher并在新线程上显示一个窗口。

0

你也可以这样做:

delegate void MyProcHandler(object param1, object param2); 

    MyForm.Invoke 
    (
      new MyProcHandler(delegate(object param1, object param2) 
      { 
      // some code 
      }), 
      null, 
      null 
    );