日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net4.0 Parallel编程(三)Data Parallelism下

發(fā)布時(shí)間:2023/12/2 asp.net 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net4.0 Parallel编程(三)Data Parallelism下 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在上篇文章中介紹了如何Break、Stop循環(huán),以及如何定義線程局部變量。在本文中介紹如何在外部去取消循環(huán)、以及異常的處理。

Cancel

在并行的循環(huán)中支持通過傳遞ParallelOptions參數(shù)中的CancellationToken進(jìn)行取消循環(huán)的控制,我們可以CancellationTokenSource實(shí)例化之后傳遞給ParallelOptions對(duì)象Cancellation值。下面來看個(gè)示例:

?

[TestMethod]public void CancelLoop(){var sourceNums = Enumerable.Range(0, 1000000000);var cts = new CancellationTokenSource();var po = new ParallelOptions();var stack = new ConcurrentStack<int>();po.CancellationToken = cts.Token;po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;Task.Factory.StartNew(() =>{foreach (var num in sourceNums){if (num == 1000000)cts.Cancel();}});try{Parallel.ForEach(sourceNums,po, num => {stack.Push(num);po.CancellationToken.ThrowIfCancellationRequested();});}catch (OperationCanceledException e){Console.WriteLine(e.Message);}Console.WriteLine(stack.Count);}

我們來看下運(yùn)行的結(jié)果:

解釋下上面的方法,并行循環(huán)的意圖是將sourceNums里面的元素推到Stack中,然后另外開啟了一個(gè)線程來控制了什么時(shí)候進(jìn)行cancel操作。也許會(huì)有個(gè)疑問,為什么不是1000000呢,原因很簡單就是上面的控制的線程不可能跟下面的同時(shí)開始的,而其每次迭代運(yùn)行所需要的時(shí)間也是不同的。

上面的示例中我們看的是如何終止Parallel的ForEach循環(huán),終止For循環(huán)是一樣的,For方法中也提供了ParallelOptions參數(shù)。

Handel Exceptions

在處理并行循環(huán)的異常的與順序循環(huán)異常的處理是有所不同的,并行循環(huán)里面可能會(huì)一個(gè)異常在多個(gè)循環(huán)中出現(xiàn),或則一個(gè)線程上的異常導(dǎo)致另外一個(gè)線程上也出現(xiàn)異常。比較好的處理方式就是,首先獲取所有的異常最后通過AggregateException來包裝所有的循環(huán)的異常,循環(huán)結(jié)束后進(jìn)行throw。看一段示例代碼:

private void HandleNumbers(int[] numbers){var exceptions = new ConcurrentQueue<Exception>();Parallel.For(0, numbers.Length, i => {try{if (numbers[i] > 10 && numbers[i] < 20){throw new Exception(String.Format("numbers[{0}] betwewn 10 to 20",i));}}catch (Exception e){exceptions.Enqueue(e);}});if (exceptions.Count > 0)throw new AggregateException(exceptions);} 測(cè)試方法: [TestMethod()]public void HandleExceptions(){var numbers = Enumerable.Range(0, 10000).ToArray();try{this.HandleNumbers(numbers);}catch(AggregateException exceptions){foreach (var ex in exceptions.InnerExceptions){Console.WriteLine(ex.Message);}}}

?

測(cè)試結(jié)果:

對(duì)上面的方法說明下,在HandleNumbers方法中,就是一個(gè)小的demo如果元素的值出現(xiàn)在10-20之間就拋出異常。在上面我們的處理方法就是:在循環(huán)時(shí)通過隊(duì)列將所有的異常都集中起來,循環(huán)結(jié)束后來拋出一個(gè)AggregateException。

總結(jié)

在本文中主要說明了如何處理異常以及如何在外部取消一個(gè)并行循環(huán)。到此Task? Parallel Library中的數(shù)據(jù)并行部分已經(jīng)結(jié)束。下面的會(huì)就學(xué)習(xí)下,任務(wù)并行部分。

作者:Henllyee Cui
出處: http://henllyee.cnblogs.com/
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明。

轉(zhuǎn)載于:https://www.cnblogs.com/Henllyee/archive/2010/06/14/ParallelProgaramming3.html

總結(jié)

以上是生活随笔為你收集整理的.Net4.0 Parallel编程(三)Data Parallelism下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。