假定現在存在一個對象數組,需要對數組中的每個對象進行分析,但是分析存在較長的耗時處理,那麼單線程處理就顯得很侷限了,這裏就採用多線程處理,但是多線程要控制最大線程數量。
線程與線程之間有會爭取 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(); } }
執行結果: