for (int j = 0; j //int sum = 0; //sum += item; lock (obj) num++; }); .Stop(); .(" run " + . + " ms."。二、 Parallel中途退出循环和异常处理( 二 )。" />

二、 Parallel中途退出循环和异常处理( 二 )


//sum += item;
num++;
.Stop();
.(" run " + . + " ms.");
.Reset();
.Start();
.For(0, 10000, item =>
for (int j = 0; j < 60000; j++)
//int sum = 0;
//sum += item;
lock (obj)
num++;
});
.Stop();
.(" run " + . + " ms.");
.For由于是并行运行的,所以会同时访问全局变量num,为了得到正确的结果,要使用lock,此时来看看运行结果:
是不是大吃一惊啊?.For竟然用了15秒多,而for跟之前的差不多 。这主要是由于并行同时访问全局变量,会出现资源争夺,大多数时间消耗在了资源等待上面 。
一直说并行,那么从哪里可以看出来.For是并行执行的呢?下面来写个测试代码:
.For(0, 100, i =>
.Write(i + "\t");
});
从0输出到99,运行后会发现输出的顺序不对,用for顺序肯定是对的,并行同时执行,所以会出现输出顺序不同的情况 。
3、.
这个方法跟方法很相似,想具体了解的,可以百度些资料看看,这里就不多说了,下面给出其使用方法:
List list = new List();
list.Add(0);
.(list, item =>
(item);
});
二、 中途退出循环和异常处理1、当我们使用到,必然是处理一些比较耗时的操作,当然也很耗CPU和内存,如果我们中途向停止,怎么办呢?
在串行代码中我们break一下就搞定了,但是并行就不是这么简单了,不过没关系,在并行循环的委托参数中提供了一个,
该实例提供了Break和Stop方法来帮我们实现 。
Break: 当然这个是通知并行计算尽快的退出循环,比如并行计算正在迭代100,那么break后程序还会迭代所有小于100的 。
Stop:这个就不一样了,比如正在迭代100突然遇到stop,那它啥也不管了,直接退出 。
下面来写一段代码测试一下:
10
11
12

二、 Parallel中途退出循环和异常处理

文章插图
13
14
15
16
void ()
bag = new ();
.Start();
.For(0, 1000, (i, state) =>
if (bag.Count == 300)
state.Stop();
;
bag.Add(i);
});
.Stop();
【二、 Parallel中途退出循环和异常处理】.("Bag count is " + bag.Count + ", " + .);
这里使用的是Stop,当数量达到300个时,会立刻停止;可以看到结果"Bag count is 300",如果用break,可能结果是300多个或者300个,大家可以测试一下 。
2、异常处理
首先任务是并行计算的,处理过程中可能会产生n多的异常,那么如何来获取到这些异常呢?普通的并不能获取到异常,然而为并行诞生的就可以获取到一组异常 。
这里我们修改.的代码,修改后代码如下:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class
= new ();
void Run1()
.Sleep(2000);
.("Task 1 is cost 2 sec");
throw new (" in task 1");
void Run2()
.Sleep(3000);
.("Task 2 is cost 3 sec");
throw new (" in task 2");
void ()
.Start();
try
.(Run1, Run2);
catch ( aex)
(var ex in aex.)
.(ex.);
.Stop();
.(" run " + . + " ms.");
.Reset();
.Start();
try
Run1();
Run2();
catch( ex)
.(ex.);
.Stop();
.(" run " + . + " ms.");

顺序调用方法我把异常处理写一起了,这样只能捕获Run1的异常信息,大家可以分开写 。捕获异常后,用循环遍历输出异常信息,可以看到两个异常信息都显示了 。