場景是批量上傳圖片,所以使用了並發。因為服務器電腦也是有瓶頸的,且多線程也不能無限開。。
所以我在使用多線程異步上傳的同時,同時控制線程並發的數量,線程數量達到閾值之后,得等待一個成功結束之后,再開啟另一個新的線程。。
主要使用:Task.WaitAny() 這個API,傳一個線程數組, 等待其中一個執行完成,只等最快的一個執行完成。。每個線程在打開之前去判斷正在運行的線程的數量
控制最大線程數量為4。 代碼:
//控制並發線程的數量 List<Task> tasks = new List<Task>(); for (int i = 0; i < 50; i++) { int k = i; Console.WriteLine($"運行數量為**{tasks.Count(t => t.Status == TaskStatus.Running)}***"); if (tasks.Count(t => t.Status == TaskStatus.Running) > 3) { var runID = tasks.Count(t => t.Status == TaskStatus.Running); Console.WriteLine($"運行數量為**{runID},大於3個了,請稍等***"); Task.WaitAny(tasks.ToArray()); tasks = tasks.Where(t => t.Status != TaskStatus.RanToCompletion).ToList(); } else { var taskItem = Task.Run(() => { Console.WriteLine($"打開新線程**{k} ***{Thread.CurrentThread.ManagedThreadId.ToString("00")}"); //處理固定的工作 Thread.Sleep(2000); }); tasks.Add(taskItem); } }
效果:
第二種方法: 利用 Parallel類來操作,通過MaxDegreeOfParallelism參數控制最大額並行數量。
Task.Run(() => { ParallelOptions parallelOptions = new ParallelOptions(); parallelOptions.MaxDegreeOfParallelism = 3; Parallel.For(0, 10, parallelOptions, i => WorkTest("das")); });
效果: 達到閾值之后,等待一個線程完成之后,才會開啟另一個線程。。
這樣就可以控制多線程並發數量啦。