c# 多线程控制最大线程数
假定现在存在一个对象数组,需要对数组中的每个对象进行分析,但是分析存在较长的耗时处理,那么单线程处理就显得很局限了,这里就采用多线程处理,但是多线程要控制最大线程数量。
线程与线程之间有会争取 CPU 资源,这就会导致上下文切换,上下文切换过多,必然增加线程的执行时间,影响了整体执行效率,所以设置过多的线程,会让cpu把更多的时间浪费在上下文切换中,效率反而降低了。
这里我们假定开15个线程。
class Program { static StringBuilder sb = new StringBuilder(); static int maxThreadNum = 15; static List<Task> tasks = new List<Task>(); static TaskFactory taskFactory = new TaskFactory(); static void Main(string[] args) { for (int i = 0; i < 100; i++) { var ii = i; tasks.Add(taskFactory.StartNew(() => { var s = Todoing(ii); sb.Append(s+","); })); if (tasks.Count >= maxThreadNum) { Task.WaitAny(tasks.ToArray()); tasks = tasks.Where(f => f.Status == TaskStatus.Running).ToList(); } } //循环完,等待剩余线程全部执行完成 Task.WaitAll(tasks.ToArray()); var sbstring = sb.ToString(); Console.WriteLine(sbstring); Console.WriteLine(sbstring.Split(",").Length); Console.ReadKey(); } static private string Todoing(int i) { Thread.Sleep(500); return i.ToString(); } }
执行结果: