【发布时间】:2009-04-13 19:24:37
【问题描述】:
我知道我可以使用 .NET 启动一个新的工作线程。但是如何启动一个新的 UI 线程(比如在 MFC 中)?
我不介意解决方案是否仅限于 Windows 机器;我也希望解决方案是纯粹的 .NET - 没有对 CreateThread 的 p/invokes 等。
任何意见表示赞赏。
【问题讨论】:
标签: c# .net multithreading user-interface
我知道我可以使用 .NET 启动一个新的工作线程。但是如何启动一个新的 UI 线程(比如在 MFC 中)?
我不介意解决方案是否仅限于 Windows 机器;我也希望解决方案是纯粹的 .NET - 没有对 CreateThread 的 p/invokes 等。
任何意见表示赞赏。
【问题讨论】:
标签: c# .net multithreading user-interface
使用Application.Run - 它在当前线程中启动一个消息循环。有重载可以从一个表单开始,或者一个应用程序上下文,或者两者都没有。 (如果你想对 new 线程执行此操作,则需要创建线程并以正常方式启动它,并使其调用Application.Run。)
【讨论】:
ShowDialog 吗?我不确定这种情况下的效果。
如果您对使用 WPF 感兴趣,请查看 MSDN 的文章 WPF's Threading Model,尤其是“多窗口,多线程”部分。它详细说明了创建新 Dispatcher 并在新线程上显示窗口所需执行的操作。
【讨论】:
如果您希望创建一个能够创建和处理窗口句柄的新线程,那么您可以在 Thread 对象上使用SetApartmentState 函数并将其设置为STA。您可能还需要在此线程的方法内调用Application.Run 以创建您的消息循环。但是,请记住,您会受到与任何其他线程中相同的跨线程禁忌(即,您只能与创建它的线程上的控件的句柄进行交互),所以如果不切换上下文,您将无法在其他 UI 线程上执行任何操作。
【讨论】:
你也可以这样做:
delegate void MyProcHandler(object param1, object param2);
MyForm.Invoke
(
new MyProcHandler(delegate(object param1, object param2)
{
// some code
}),
null,
null
);
【讨论】: