Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WinForms中,UI中是否可以有多个线程?_C#_Multithreading_Winforms - Fatal编程技术网

C# 在WinForms中,UI中是否可以有多个线程?

C# 在WinForms中,UI中是否可以有多个线程?,c#,multithreading,winforms,C#,Multithreading,Winforms,我想答案是否定的。我在stackoverflow上检查了类似的问题,但根据具体解决方案的需要,这些问题似乎朝着不同的方向发展(但可能遗漏了一些东西) WinForms应用程序中是否可能有多个UI线程?我正在重构,想知道我是否应该使用ConcurrentDictionary,或者使用那些线程访问表单的字典。这适用于具有多个开发人员/设计的更大的代码体,我希望做出尽可能可靠的选择(但不要过度设计)。因为我在寻找一个一般性的答案,所以这个问题中没有具体的问题,尽管它们通常是这样的。感谢您的关注和帮助-

我想答案是否定的。我在stackoverflow上检查了类似的问题,但根据具体解决方案的需要,这些问题似乎朝着不同的方向发展(但可能遗漏了一些东西)


WinForms应用程序中是否可能有多个UI线程?我正在重构,想知道我是否应该使用ConcurrentDictionary,或者使用那些线程访问表单的字典。这适用于具有多个开发人员/设计的更大的代码体,我希望做出尽可能可靠的选择(但不要过度设计)。因为我在寻找一个一般性的答案,所以这个问题中没有具体的问题,尽管它们通常是这样的。感谢您的关注和帮助-非常感谢。

是的,这是可以做到的,但这样做通常是错误的

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

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

因为您是在线程安全的上下文中提问的,所以我建议您记住MVVM和MVP模式。如果您的结构位于视图、Presenter或ViewModel中,则不需要线程安全性。该模型通常存在于不同的线程中,或者与不同的线程进行对话,例如,如果它是一个数据库或数据库上的包装器。因此,线程安全性通常是模型设计的一部分,或者是模型与ViewModel/Presenter通信的一部分

看,,

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

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并不一定是个好主意。你必须了解后果。我建议你读一读。这是从1993年开始的,但是唯一不推荐的部分是关于从windows 3.1迁移的。

答案是肯定的,尽管很少这样做。每个窗体都可以有一个不同的线程(尽管每个控件只有一个关联的UI线程)。我不会说使用多个UI线程“通常是错误的”。今天的趋势是,即使是UI也要并行化。现代网络浏览器为每个标签创建一个新的线程(甚至进程);其他应用程序没有理由不这样做。每个选项卡使用一个独立的进程是为了相互屏蔽,这是一个主要的好处。简单地使用一个额外的UI线程的好处远不如使用一个不同的进程(它可能会崩溃并自行重新启动)的好处,例如提供对遗留功能的访问。我只是看到了更多错误的例子,而不是正确的例子,这就是为什么我说它通常是错误的-但我同意这是一种观点。谢谢你的例子和文章参考!