.Net 多線程,異步且控制並發數量


      場景是批量上傳圖片,所以使用了並發。因為服務器電腦也是有瓶頸的,且多線程也不能無限開。。

      所以我在使用多線程異步上傳的同時,同時控制線程並發的數量,線程數量達到閾值之后,得等待一個成功結束之后,再開啟另一個新的線程。。

 

主要使用: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"));
                });

 

效果:  達到閾值之后,等待一個線程完成之后,才會開啟另一個線程。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

這樣就可以控制多線程並發數量啦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM