生活随笔
收集整理的這篇文章主要介紹了
Parallel使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Parallel的靜態For,ForEach和Invoke方法
Parallel是對Task的封裝,目的是簡化一些常見的編程情形中任務Task的使用,它內部使用Task。
以上三者的編程情形:
Parallel.For(0,1000,i=>DoWork(i));//指定某個操作的執行次數
Parallel.ForEach(collection,item=>DoWork(item));//利用集合collection中的每一項item執行并發操作。
Parallel.Invoke(
()=>Method1(),
()=>Method2(),
()=>Method3());//并發執行一些方法
注意:
1.如果任何操作拋出未處理的異常,Parallel方法最后會拋出一個AggregateException
2.并發的前提條件:
1)工作項必須能并行之行
2)避免過多的資源爭用,會導致上下文切換過于頻繁和鎖爭用問題。
3.Parellel本身有開銷,所以如果并發執行的每一項都能很快執行,那么不應該使用并發執行。
應用并發的場景:
1)IO限制
計算不復雜,但是需要等待操作完成,如訪問數據庫等耗時較長的操作就是IO限制。
2)計算限制
計算過于復雜,執行計算的線程需要耗很長時間才能結束計算。如果等待這個線程完成再執行別的操作,那么可能等很長時間
???那么采集點數較少時使用同步,采集點數過多時使用異步這個屬于哪個限制導致的多線程問題??ParallelOptions
Parallel的靜態For,ForEach和Invoke方法都提供了接受一個ParallelOptions對象的重載版本。
public class ParallelOptions{public ParallelOptions();public CancellationToken cancellationToken{get;set;}//取消操作,默認為CancellationToken.Nonepublic Int32 MaxDegreeOfParallelism{get;set;}//允許指定可以并發操作的最大工作項數目,默認為-1(可用CPU數)public TaskScheduler TaskScheduler{get;set;}//使用哪個TaskScheduler,默認為TaskScheduler.Default
}For,ForEach的三個操作的重載版本
任務局部初始化委托(localInit),為參與工作的每個任務都調用一次該委托。這個委托時在任務被要求出來一個工作項之前調用的。
主體委托(body),為參與工作的各個線程所處理的每一項都調用一次該委托
任務局部終結委托(localFinally),為參與工作的每一個任務都調用一次該委托。這個委托是在任務處理好派發給它的所有工作項之后調用的。即時主體委托代碼引發一個未處理的異常,也會調用它。
此調用的參數較復雜,具體參見MSDNParallelLoopState對象參與工作的每個任務都獲得它自己的ParallelLoopState對象,并可通過這個對象和參與工作的其他任務進行交互。
public class ParallelLoopState{public void Stop();//告訴循環停止處理任何更多的工作public Boolean IsStopped{get;}public void Break();//告訴循環不再處理當前項之后的項public Int64? LowestBreakIteration{get;}public Boolean IsExceptional{get;}public Boolean ShouldExitCurrentIteration{get;}//是否可以提前退出
}ParallelLoopResult對象
Parallel的靜態For,ForEach方法都返回一個ParallelLoopResult實例
public struct ParallelLoopResult
{//如果操作提前終止,以下方法返回falsepublic Boolean IsCompleted{get;}public Int64? LowestBreakIteration{get;}
}
總結
以上是生活随笔為你收集整理的Parallel使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。