2009-04-13 179 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 
    );