【问题标题】:Two UI Thread in C# windows ApplicationC# windows 应用程序中的两个 UI 线程
【发布时间】:2011-01-25 12:08:28
【问题描述】:

如何在 C# windows 应用程序中实现两个 ui 线程?

【问题讨论】:

  • @Joey:虽然 WinForms/WPF 控件具有线程亲和性,但实际上可以有多个 UI 线程,只要它们不共享控件即可。
  • @Joey:这并不常见,这可能是他在这里问的原因,因为关于它的信息很少。在 WPF 中,我什至不认为这是可能的,因为 Application 被强制为单例并且与主线程具有亲和力。

标签: c# winforms


【解决方案1】:

在启动线程之前,您需要调用 Thread.SetApartmentState() 将线程切换到 STA。并泵出一个消息循环以保持在该线程上创建的任何窗口,Application.Run()。 Application.ExitThread() 将终止消息循环并导致线程退出。使用 Run(Form) 可以自动完成,就像在主线程上一样。

但请注意,用户可能很难处理您在该线程上创建的窗口。它们与主线程中的窗口没有 Z 顺序关系,桌面是它们的父级。这往往使他们很容易迷失在另一个窗口后面,包括你自己的。尴尬的解决方法是 TopMost 和 pinvoking SetParent()。

【讨论】:

    【解决方案2】:

    这可能不是答案,而是更多的解释。

    如果允许两个线程同时访问同一个像素——这将是多线程 UI 的结果——你需要在线程之间进行某种同步。如果线程不同步,应该如何确定像素的颜色?

    所以我们必须添加锁定。锁定每个像素的成本非常高,因此我们很快就会转向锁定每个控件或每个窗口。你去吧:通过允许 1 个且只有 1 个线程访问我们已实现锁定的 UI。

    顺便说一句:用控件或控件树替换像素;它不仅与像素有关,还与共享数据有关,无论是像素还是控件。

    【讨论】:

      【解决方案3】:

      在新线程中调用Application.Run(...),它将打开带有自己的消息循环的表单。

      new Thread(() => Application.Run(someForm)).Start();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 2011-04-12
        相关资源
        最近更新 更多