我知道我可以從.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