【问题标题】:How to start a UI thread in C#如何在 C# 中启动 UI 线程
【发布时间】:2009-04-13 19:24:37
【问题描述】:

我知道我可以使用 .NET 启动一个新的工作线程。但是如何启动一个新的 UI 线程(比如在 MFC 中)?

我不介意解决方案是否仅限于 Windows 机器;我也希望解决方案是纯粹的 .NET - 没有对 CreateThread 的 p/invokes 等。

任何意见表示赞赏。

【问题讨论】:

    标签: c# .net multithreading user-interface


    【解决方案1】:

    使用Application.Run - 它在当前线程中启动一个消息循环。有重载可以从一个表单开始,或者一个应用程序上下文,或者两者都没有。 (如果你想对 new 线程执行此操作,则需要创建线程并以正常方式启动它,并使其调用Application.Run。)

    【讨论】:

    • Application.Run 与我之前一直使用的 ShowDialog 相比如何?
    • @supercat:那你是从非 UI 线程调用ShowDialog 吗?我不确定这种情况下的效果。
    • 是的,我从非 UI 线程调用 ShowDialog;明显的效果是这样创建的新窗口将有一个独立于任何其他窗口的 UI 线程的 UI 线程。如果窗口不尝试与其他线程上的任何控件交互,并且不尝试将其 MdiParent 设置为在另一个线程上运行的窗口,它似乎工作得很好。
    • @supercat:您是否检查过它是否在 calling 线程中运行消息循环,或者只是创建一个新的 UI 线程并阻塞调用线程直到窗口完成?
    • 即使主UI线程被阻塞,新窗口也会有响应,阻塞新窗口的UI线程不会影响主窗口。我认为剪贴板之类的东西可能存在一些问题,但主要是我将这种方法用于进度更新或状态窗口之类的东西(例如,如果我有一个控件在主 UI 窗口和另一个窗口中显示旋转使用不同的线程,我可以直观地区分阻塞所有线程的垃圾收集和暂时阻塞 UI 线程但让其他线程运行的操作。
    【解决方案2】:

    如果您对使用 WPF 感兴趣,请查看 MSDN 的文章 WPF's Threading Model,尤其是“多窗口,多线程”部分。它详细说明了创建新 Dispatcher 并在新线程上显示窗口所需执行的操作。

    【讨论】:

      【解决方案3】:

      如果您希望创建一个能够创建和处理窗口句柄的新线程,那么您可以在 Thread 对象上使用SetApartmentState 函数并将其设置为STA。您可能还需要在此线程的方法内调用Application.Run 以创建您的消息循环。但是,请记住,您会受到与任何其他线程中相同的跨线程禁忌(即,您只能与创建它的线程上的控件的句柄进行交互),所以如果不切换上下文,您将无法在其他 UI 线程上执行任何操作。

      【讨论】:

        【解决方案4】:

        你也可以这样做:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-05
          • 2010-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多