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不要这样改变问题。它会断章取义地给出答案,而且不会“碰撞”问题,因此没有任何新的观点。请将其编辑回旧版本,然后分别询问新问题我的电脑是双核的。即使我只做了两个线程,问题仍然存在。你是只运行你的应用程序还是其他许多应用程序和服务也在运行(操作系统服务和应用程序),它们也需要线程来执行操作。我仍然想知道你在找什么?如果你有不同的想法,那么你可以找到其他的解决方案。