VS2005 c#多线程:如何启动10个线程

时间:2009-08-25 19:05:45

标签: c# multithreading

在for循环中启动10个线程的最佳方法是什么,以获得流程密集型方法。代码示例非常有用。

for (int i = 0; i<=10; i++) //10 threads are intended.
{
    LongRunningMethod();
}

6 个答案:

答案 0 :(得分:5)

ThreadPool.QueueUserWorkItem

答案 1 :(得分:2)

或者如果您不想使用线程池,只需创建并启动一个新线程。

new Thread( delegate() { LongRunningMethod(); } ).Start();

答案 2 :(得分:2)

如其他答案中所述,您可以使用ThreadPool.QueueUserWorkItem在线程池中的线程上安排作业,或者为该工作创建新的显式Thread实例。您可以在MSDN Threading Tutorial了解有关创建线程的各种方法的更多信息。

您使用哪种方法会对您的应用和CLR的性能和行为产生一定的影响。有关详细信息,请阅读When to use thread pool in C#

答案 3 :(得分:1)

使用Action作为委托为每个长时间运行的方法调用创建一个新线程。

Action newThread = new Action(LongRunningMethod);

// Call Async which is a new thread
newThread.BeginInvoke(null, null);

没有模板的操作仅在.NET 3.5中,对于.NET 2.0,您必须声明委托

public delegate void NoParametersMethod();

NoParametersMethodnewThread = new NoParametersMethod(LongRunningMethod);

// Call Async which is a new thread
newThread.BeginInvoke(null, null);

答案 4 :(得分:1)

这里的答案和评论可能看起来有点分歧,这是因为这里要做的第一件事就是检查你的LongRunningMethod()是否适合Threadpool。如果是那么使用ThreadPool是最好的选择(低开销,一些基本的负载均衡)。

否则,请使用Thread和ThreadStart:

ThreadStart starter = new ThreadStart(LongRun);

for (int i = 1; i <= 10; i++) // 10 threads are intended, note the i=1
{    
    Thread t = new Thread(starter);
    t.Start();
}

注1:还存在ParameterizedThreadStart类 注意2:您无法将其缩放为i&lt; 100或者什么,你需要保持最大线程数。游泳池已经做到了。

来自MSDN:

何时不使用线程池线程

有几种情况适合创建和管理自己的线程而不是使用线程池线程:

  • 您需要一个前台线程。
  • 您需要一个线程来拥有一个特定的 优先级。
  • 您的任务导致线程长时间阻塞。线程池具有最大线程数,因此大量被阻塞的线程池线程可能会阻止任务启动。
  • 您需要将线程放入单线程单元中。所有ThreadPool线程都在多线程单元中。
  • 您需要具有与该线程关联的稳定标识,或者将线程专用于任务。

请注意,MSDN没有说出“很长一段时间”是什么。我会对它进行一次尝试,并说当你的任务需要≥0.5秒时,你可能会开始查看单独的线程。创建线程的开销变得微不足道。但这取决于很多因素。

答案 5 :(得分:0)

像这样的简单......

var threads    = new List<Thread>();
var numThreads = 10;

for( int i = 0; i < numThreads; i++ )
{
  threads.Add( new Thread( () => DoWork() ) );
  threads[i].Name = i.ToString();
  threads[i].Start();
}