博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一起谈.NET技术,.Net4.0 Parallel编程(三)Data Parallelism 下
阅读量:5775 次
发布时间:2019-06-18

本文共 2192 字,大约阅读时间需要 7 分钟。

  在中介绍了如何Break、Stop循环,以及如何定义线程局部变量。在本文中介绍如何在外部去取消循环、以及异常的处理。

  Cancel

  在并行的循环中支持通过传递ParallelOptions参数中的进行取消循环的控制,我们可以CancellationTokenSource实例化之后传递给ParallelOptions对象Cancellation值。下面来看个示例:

 
[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);
}

  我们来看下运行的结果:

  解释下上面的方法,并行循环的意图是将sourceNums里面的元素推到Stack中,然后另外开启了一个线程来控制了什么时候进行cancel操作。也许会有个疑问,为什么不是1000000呢,原因很简单就是上面的控制的线程不可能跟下面的同时开始的,而其每次迭代运行所需要的时间也是不同的。

  上面的示例中我们看的是如何终止Parallel的ForEach循环,终止For循环是一样的,For方法中也提供了ParallelOptions参数。

  Handel Exceptions

  在处理并行循环的异常的与顺序循环异常的处理是有所不同的,并行循环里面可能会一个异常在多个循环中出现,或则一个线程上的异常导致另外一个线程上也出现异常。比较好的处理方式就是,首先获取所有的异常最后通过AggregateException来包装所有的循环的异常,循环结束后进行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);
}

  测试方法:

 
[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);
}
}
}

  测试结果:

  对上面的方法说明下,在HandleNumbers方法中,就是一个小的demo如果元素的值出现在10-20之间就抛出异常。在上面我们的处理方法就是:在循环时通过队列将所有的异常都集中起来,循环结束后来抛出一个AggregateException。

  总结

  在本文中主要说明了如何处理异常以及如何在外部取消一个并行循环。到此Task  Parallel Library中的数据并行部分已经结束。下面的会就学习下,任务并行部分。

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162763.html

你可能感兴趣的文章
填坑记:Uncaught RangeError: Maximum call stack size exceeded
查看>>
SpringCloud之消息总线(Spring Cloud Bus)(八)
查看>>
DLA实现跨地域、跨实例的多AnalyticDB读写访问
查看>>
实时编辑
查看>>
KVO原理分析及使用进阶
查看>>
【348天】每日项目总结系列086(2018.01.19)
查看>>
【294天】我爱刷题系列053(2017.11.26)
查看>>
Microsoft发布了Azure Bot Service和LUIS的GA版
查看>>
Google发布Puppeteer 1.0
查看>>
.NET开源现状
查看>>
可替换元素和非可替换元素
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
(Portal 开发读书笔记)Portlet间交互-PortletSession
查看>>
搭建vsftpd服务器,使用匿名账户登入
查看>>
AMD改善Linux驱动,支持动态电源管理
查看>>
JAVA中循环删除list中元素的方法总结
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
人人都会深度学习之Tensorflow基础快速入门
查看>>
ChPlayer播放器的使用
查看>>
js 经过修改改良的全浏览器支持的软键盘,随机排列
查看>>