【问题标题】:mdi app with multiple GUI threads具有多个 GUI 线程的 mdi 应用程序
【发布时间】:2008-10-21 20:19:15
【问题描述】:

C# MDI 应用程序可以为 MDI 中的每个子级提供单独的 GUI 线程吗?

例如,如果其中一个子窗体被某个同步请求阻塞,它会冻结整个容器 (MDI Parent),并且其他打开的窗口也变得可访问。

一般来说,.net windows form app domain中是否可以有多个GUI线程?

在 Visual Studio 中默认的 winform 应用程序具有 STA(单线程单元)设置。 理论上我理解 MTA 在这里的含义,但它的实际用途是什么。

在我的用例中,单个 mdi 子项是由不同的团队开发的,他们可能不会以异步方式推迟阻塞调用,所以我只是想知道是否可以有多个 UI 线程,尽管这不是可取的 - 我完全同意。

编辑#1:

我可以将 google chrome 浏览器视为 单个选项卡的示例 单独的过程可能与 专用的 GUI 线程?是东西 像这样在 dot.net 应用程序中是可能的。

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    与其试图强制多个线程进入 GUI 层,不如让 GUI 层将其所有工作推迟到后台线程。这样,如果某个后台线程变得无响应,则整个 GUI(包括反映无响应后台线程的 MDI 子级)都会响应。

    【讨论】:

    • 同意。总是更好地重构它,以便您的 GUI 在单个专用线程上运行,并将后台工作分配给工作线程,然后在工作完成时回调到主线程。
    • 在我的用例中,单个 mdi 子项是由不同的团队开发的,他们可能不会以异步方式推迟阻塞调用,所以我只是想知道是否可以有多个 UI 线程,尽管它不是可取的- 我完全同意。
    • 这还不够。有些控件可能需要做 UI 繁重的工作,比如绘图,我们可能希望将这些 UI 控件分开,以便它们可以同时绘图。您的回答可能是一个很好的指导方针,但没有回答问题。我知道可以将它们分离到自己的 UI 线程中,我可以在自己的应用程序中使用它,但是在涉及某些控制消息时遇到了一些问题。
    【解决方案2】:

    没有。您不能在 .NET 中使用多个 UI 线程。 您最好使用后台线程来处理那里的耗时操作。 如果您需要在操作运行时阻止窗口,最好创建一些解决方法。

    【讨论】:

    • 在我的用例中,单个 mdi 子项是由不同的团队开发的,他们可能不会以异步方式推迟阻塞调用,所以我只是想知道是否可以有多个 UI 线程,尽管它不是可取的- 我完全同意。
    • 我可以将 google chrome 浏览器视为一个示例,其中单个选项卡是一个单独的进程,可能具有专用的 GUI 线程?在 dot.net 应用程序中是否可能发生这样的事情
    • 这根本不是真的。 UI 线程具有线程关联性,因此您必须编组来自其他线程的请求。没有什么可以阻止您创建多个 UI 线程(只要您知道自己在做什么)
    猜你喜欢
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多