在for循环中启动10个线程的最佳方法是什么,以获得流程密集型方法。代码示例非常有用。
for (int i = 0; i<=10; i++) //10 threads are intended.
{
LongRunningMethod();
}
答案 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:
有几种情况适合创建和管理自己的线程而不是使用线程池线程:
请注意,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();
}