[英]Task Parallelism (TPL) and Task Scheduling in C#
據微軟( 鏈接 ),有兩種方法來啟動一個任務: 隱 顯 。
假設我在主線程中創建了4個不同的任務,分別稱為task1,task2,task3和task4。
case1 :我在主線程中顯式運行它們:
task1.Start();
task2.Start();
task3.Start();
task4.Start();
case2 :我在主線程中使用Parallel.Invoke方法隱式運行它們:
Parallel.Invoke(task1, task2, task3, task4);
我注意到的唯一區別是在case2中,主線程掛起,直到Invoke()返回。
我的問題是關於任務計划程序的 。 任務計划程序在case1和case2中執行4個任務時,它們的調度方式是否完全相同?
在我上面提到的同一鏈接中,我們看到:
在后台,任務被排隊到ThreadPool中,該線程池已通過算法(例如爬山)進行了增強,該算法確定並調整了線程數量以最大化吞吐量。 這使任務相對輕量,您可以創建許多任務以啟用細粒度的並行性。 為了補充這一點,采用了廣為人知的工作竊取算法來提供負載平衡。
Parallel團隊的這篇博客文章應該回答您的一些問題。
簡短的答案:使用Tasks,您將必須在主線程上執行Task :: WaitAll(...),以防止退出Parallel :: Invoke會真正為您處理的地方。 除此之外,別無其他,因為在Parallel :: Invoke下使用了相同的TPL基礎結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.