【问题标题】:In WinForms, Is More than One Thread Possible in the UI?在 WinForms 中,UI 中是否可能存在多个线程?
【发布时间】:2014-02-12 13:02:18
【问题描述】:

我认为答案是否定的。我在stackoverflow上检查了类似的问题,但它们似乎根据特定解决方案所需的内容走向不同的方向(但可能遗漏了一些东西)。

在 WinForms 应用程序中是否有可能拥有多个 UI 线程?我正在重构并想知道是否应该使用可以从那些访问表单的线程访问的 ConcurrentDictionary 或 Dictionary 。这是针对具有多个开发人员/设计的大量代码,我希望做出尽可能可靠的选择(但不要过度设计它)。由于我正在寻找一般性答案,因此尽管通常情况下,但具体情况不在此问题中。感谢您的关注和任何帮助 - 非常感谢。

【问题讨论】:

  • 答案是肯定的,尽管很少这样做。您可以为每个表单拥有一个不同的线程(尽管每个控件只有一个关联的 UI 线程)。 dotnetbeyond.blogspot.com/2011/10/…

标签: c# multithreading winforms


【解决方案1】:

是的,可以这样做,但这样做通常是错误的。 Multiple UI Threads - Winforms

我遇到的每一个明智的 GUI 设计总是使用单个 UI 线程,即使框架允许的不止这些。我可以看到的唯一例外是独立的窗口存在于它们自己的线程中并从存在于不同线程中的模型访问共享数据,但这种设计的好处是有限的。 (编辑:在某些情况下,使用多个 UI 线程的更好选择是为不同的窗口使用不同的进程——比如浏览器中的选项卡——因为这允许主应用程序恢复,例如,如果一个窗口损坏了堆。)

但是,对于任何相当高级的应用程序,都会有多个非 UI 后台线程。

因为您是在线程安全的上下文中询问的,所以我建议您牢记 MVVM 和 MVP 模式。如果您的结构位于 View、Presenter 或 ViewModel 中,则不需要线程安全。模型经常生活在不同的线程中或与之交谈 - 例如。如果它是数据库或数据库的包装器。所以线程安全通常是 Model 设计的一部分,或者是 Model 与 ViewModel/Presenter 通信的一部分。

MVVM: Tutorial from start to finish?, What are MVP and MVC and what is the difference?

【讨论】:

  • 我不会说使用多个 UI 线程“通常是错误的”。今天的趋势是并行化甚至 UI。现代网络浏览器为每个选项卡创建一个新线程(甚至是进程);其他应用程序没有理由不这样做。
  • 对每个选项卡使用一个独立的进程来将它们相互屏蔽,这是一个主要的好处。简单地使用额外的 UI 线程的好处远小于不同进程的好处(可能会崩溃并自行重新启动),例如提供对旧功能的访问。我刚刚看到的错误示例多于正确示例,这就是为什么我说它通常是错误的 - 但我同意这是一种观点。
【解决方案2】:

是的,如果您需要,这是完全可能的。以下是使用相同表单的新实例生成线程的表单示例:

public partial class Form1: Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click( object sender, EventArgs e )
    {
        Thread t = new Thread( ThreadProc );
        t.Start();
    }

    static void ThreadProc()
    {
        Application.Run( new Form1() );
    }
}

但是,设计多线程 GUI 不一定是个好主意。你必须了解后果。我建议你阅读the MSDN article about the subject。它是从 1993 年开始的,但唯一不推荐使用的部分是关于从 Windows 3.1 迁移。

【讨论】:

  • 感谢示例和文章参考!
猜你喜欢
  • 2011-11-25
  • 2011-07-05
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2011-09-03
  • 2011-08-06
  • 2021-05-09
  • 2018-12-08
相关资源
最近更新 更多