Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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# 为什么C语言中的多线程处理速度慢#_C# - Fatal编程技术网

C# 为什么C语言中的多线程处理速度慢#

C# 为什么C语言中的多线程处理速度慢#,c#,C#,当此代码运行且所有三个线程都在运行时,标签中随机数的显示会变慢。当停止一个或两个线程时,处理速度会加快。为什么呢 namespace MultiThreadingCheckBox { public partial class Form1 : Form { Thread t1, t2, t3; public Form1() { InitializeComponent(); } pri

当此代码运行且所有三个线程都在运行时,标签中随机数的显示会变慢。当停止一个或两个线程时,处理速度会加快。为什么呢

namespace MultiThreadingCheckBox
{
    public partial class Form1 : Form
    {
        Thread t1, t2, t3; 
        public Form1()
        {
            InitializeComponent();
        }

    private void Form1_Load(object sender, EventArgs e)
    {
        t1 = new Thread(new ThreadStart(DoWork1));
        t2 = new Thread(new ThreadStart(DoWork2));
        t3 = new Thread(new ThreadStart(DoWork3));
        t1.Start();
        t2.Start();
        t3.Start();
    }

    private void DoWork1()
    {
        Random p = new Random(); 
        while (true)
        {
            label1.Invoke(new MethodInvoker(delegate { label1.Text = p.Next(1, 1000).ToString(); })); 
        }
    }

    private void DoWork2()
    {
        Random p = new Random();
        while (true)
        {
            label2.Invoke(new MethodInvoker(delegate { label2.Text = p.Next(1, 1000).ToString(); }));
        }
    }

    private void DoWork3()
    {
        Random p = new Random();
        while (true)
        {
            label3.Invoke(new MethodInvoker(delegate { label3.Text = p.Next(1, 1000).ToString(); }));
        }
    }
    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked == true)
        {
            t1.Suspend();
            label1.Invoke(new MethodInvoker(delegate { label1.Text = "I am stopped"; }));
        }
        else
            t1.Resume(); 
    }

    private void checkBox2_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox2.Checked == true)
        {
            t2.Suspend();
            label2.Invoke(new MethodInvoker(delegate { label2.Text = "I am stopped"; }));
        }
        else
            t2.Resume(); 
    }

    private void checkBox3_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox3.Checked == true)
        {
            t3.Suspend();
            label3.Invoke(new MethodInvoker(delegate { label3.Text = "I am stopped"; }));
        }
        else
            t3.Resume(); 
    }
}

}

首先,当线程每次等待执行时,您的全线程进程都会继续循环

现在第二件事是系统配置。若你们有多核系统,那个么每个核可以执行一个线程,所以若4核是,那个么三个线程并行执行,但若单核或双核,那个么线程必须等待执行


第三点是,每次使用invoke for label将每个开关上下文更新回UI线程时,都会降低并影响应用程序的性能。

首先,在表单上显示内容需要UI线程执行工作。
因此,当您调用()时,可以调用对UI线程的同步调用来更改显示。
这意味着线程向UI线程发送一条消息,并进入睡眠状态,直到收到完成的信号

要避免这种情况,请使用
BeginInvoke
,这将向UI线程发送一条异步消息,并且不会暂停线程

现在,第二个问题是,您使用的线程数超过了内核数。
因此,由于实际的物理原因,CPU无法真正并行运行,因为它没有其他内核来执行此操作。

因此,这不是真正的并行性,除了线程在调用中进入休眠状态之外,您的性能也会变慢。

另一方面,由于Yochai Timmer和dotnetstep已经解释了为什么这会导致性能变慢,我还建议您使用,而不是生成自己的线程。任务将为您管理一个线程池,并且可能比您实际管理的线程池更高效,而无需投入太多精力


显然,您编写的是一个示例应用程序,因此您可能已经了解了任务。在这种情况下,我同意Yochai的观点,您肯定应该使用BeginInvoke来异步访问UI。

您的CPU有多少个内核?您的独立线程可能会花费大量时间调用整理到单个UI线程的委托。请尝试使用
BeginInvoke
,而不是调用。你的线程模型就是问题所在。如果这些线程正在竞争一个共享资源,这就是您的UI消息循环,那么所有这些都是必需的。在并行时,您应该尽可能远离共享资源。Thanx Yochai,我根据您的建议编辑了上面的代码。处理仍然很慢。即使我只做了两条线。(我的电脑是双核的)。@AymenKareem不要这样改变问题。它会断章取义地给出答案,而且不会“碰撞”问题,因此没有任何新的观点。请将其编辑回旧版本,然后分别询问新问题我的电脑是双核的。即使我只做了两个线程,问题仍然存在。你是只运行你的应用程序还是其他许多应用程序和服务也在运行(操作系统服务和应用程序),它们也需要线程来执行操作。我仍然想知道你在找什么?如果你有不同的想法,那么你可以找到其他的解决方案。