2012-07-09 159 views
-6

我创建多线程应用程序如下:C#多线程 - 很慢

http://blog.milrr.com/2010/03/code-c-simple-multithreading-example.html

它有很多性能问题。看起来,每个线程都一一执行。

1个线程完成时间为1-2秒,30个线程完成时间为35-40秒。

请告诉我什么是问题。

我正在使用.net框架3.5。

感谢

+3

Tbh,这不是多线程的好例子。它只显示技术方面,而不是如何正确使用它。多线程不是即时获胜,它不会神奇地加速你的应用程序。 – Dykam 2012-07-09 09:32:37

+10

请发布您的代码,而不是您跟随的模板的链接。 – 2012-07-09 09:33:06

+0

你的机器有多少核心? – 2012-07-09 09:33:20

回答

0

多个线程的I/O操作和在那里你必须等待资源,或提供更好的用户体验,同时等待长时间运行的过程操作是有利的。

但是线程有它自己的开销,如果没有正确使用可能会减慢速度。

+2

IMO真正的多线程,在多线程上执行非平凡的代码,对IO或其他等待操作没有用处,它只对CPU绑定操作有用。对于IO操作,在主线程上完成事件触发事件会更好。 – CodesInChaos 2012-07-09 09:45:58

+0

我在机器上有2个核心。我有非常大的代码,我遵循完全相同的方法,如在URL中。这是正确的方法吗?任何人都可以发布网址,我可以看到如何实现多线程,可以给我很好的表现? – 2012-07-09 09:50:53

0

线程来提高性能..

你给的链接使用的threads..so你的感觉就像它的缓慢排队..

但是你可以使用线程,如果他们以平行运行不干预对方..

here为.NET 4

3.5去herehere等。

1

该示例不会创建30个线程,它会为线程池创建30个任务。池本身通常会保持它使用的线程数量接近系统中的核心数量。

假设你有2个核心。这意味着池不会计划同时运行超过2-3个任务,这意味着如果您创建30个任务,那么您的运行时间将不会比单个线程应用顺序运行任务的时间缩短一半。这是有道理的,因为假设你可以比2核心提升2倍以上的速度(除了一些特殊情况)是荒谬的。

此外,该示例没有显示任何有意义的计算。它只是创建一定数量的执行孤立计算的任务。你创造的任务越多,完成的时间就越多,这就是为什么你看到增加的运行时间,你创建的任务越多。

简而言之:

  1. 该博客文章是加快应用程序的坏榜样(我敢肯定,这不是帖子的目的)。
  2. 如果CPU限制,则创建更多线程将不会加速应用程序。
-1

你可以做这样的事情,

private List<Thread> myThreads = new List<Thread>(); 

在这里,你建立线程的列表,以便在那里你会看执行为你这样做存在一个线程,你只需将其添加到上面的列表....

foreeach (Thing i want to start multiple times) 
{ 

var thrd = new Thread(aThread); 

myThreads.Add(aThread); 
aThread.Start(); 

} 

接下来你调用一个方法,将等待线程加入...

WaitUntilAllThreadsComplete(); 

private void WaitUntilAllThreadsComplete() 

     { 
      foreach (Thread t in myThreads) 
      { 
       t.Join(); 
      } 
     } 

像这样的东西..对不起,它很含糊..但可能有帮助吗?

-2

简而言之,线程是邪恶的。您只想在特定情况下和代码的特定部分中使用线程。已经提到的一个很好的例子是随机的,令人难以置信的长期任务,一旦执行,与程序的其余部分完全无关,但需要完成。