在WinForms中,UI中可能有多个线程吗?

时间:2014-02-12 13:02:19

标签: c# multithreading winforms

我认为答案是肯定的。我在stackoverflow上检查了类似的问题,但它们似乎根据特定解决方案所需的内容(但可能已经错过了某些内容)进行了不同的指示。

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:4)

是的,如果你需要的话,这是完全可能的。下面是一个使用相同格式的新实例生成线程的表单示例:

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迁移。