5天玩转c#并行和多线程编程第一天认识parallelWord文档格式.docx
- 文档编号:18474376
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:7
- 大小:17.72KB
5天玩转c#并行和多线程编程第一天认识parallelWord文档格式.docx
《5天玩转c#并行和多线程编程第一天认识parallelWord文档格式.docx》由会员分享,可在线阅读,更多相关《5天玩转c#并行和多线程编程第一天认识parallelWord文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
其使用方法如下:
varstopWatch=newStopWatch();
//创建一个Stopwatch实例
stopWatch.Start();
//开始计时
stopWatch.Stop();
//停止计时
stopWatch.Reset();
//重置StopWatchstopWatch.Restart();
//重新启动被停止的StopWatchstopWatch.ElapsedMilliseconds//获取stopWatch从开始到现在的时间差,单位是毫秒本次用到的就这么多知识点,想了解更多关于StopWatch的,去XX一下吧,网上有很多资料。
下面进入整体,开始介绍Parallel.Invoke方法,废话不多说了,首先新建一个控制台程序,添加一个类,代码如下:
publicclassParallelDemo
{
privateStopwatchstopWatch=newStopwatch();
publicvoidRun1()
Thread.Sleep(2000);
Console.WriteLine("
Task1iscost2sec"
);
}
publicvoidRun2()
Thread.Sleep(3000);
Task2iscost3sec"
}publicvoidParallelInvokeMethod(){
Parallel.Invoke(Run1,Run2);
Parallelrun"
+stopWatch.ElapsedMilliseconds+"
ms."
stopWatch.Restart();
Run1();
Run2();
Normalrun"
+
stopWatch.ElapsedMilliseconds+"
代码很简单,首先新加一个类,在类中写了两个方法,Run1和Run2,分别等待一定时间,输出一条信息,然后写了一个测试方法ParallelInvokeMethod,分别用两种方法调用
Run1和Run2,然后在main方法中调用,下面来看一下运
行时间如何:
大家应该能够猜到,正常调用的话应该是5秒多,而Parallel.Invoke方法调用用了只有3秒,也就是耗时最长的那个方法,可以看出方法是并行执行的,执行效率提高了很多。
2、Parallel.For
这个方法和For循环的功能相似,下面就在类中添加一个方法来测试一下吧。
代码如下:
publicvoidParallelForMethod()
for(inti=0;
i10000;
i++)
for(intj=0;
j60000;
j++)
intsum=0;
sum+=i;
NormalForrun"
stopWatch.Reset();
Parallel.For(0,10000,item=>
sum+=item;
});
ParallelForrun"
写了两个循环,做了一些没有意义的事情,目的主要是为了消耗CPU时间,同理在main方法中调用,运行结果如下图:
可以看到,Parallel.For所用的时间比单纯的for快了1秒多,可见提升的性能是非常可观的。
那么,是不是Parallel.For在任何时候都比for要快呢?
答案当然是“不是”,要不然微软还留着for干嘛?
下面修改一下代码,添加一个全局变量num,代码如下:
varobj=newObject();
longnum=0;
ConcurrentBaglong>
bag=new
();
stopWatch.Start();
//intsum=0;
//sum+=item;
num++;
lock(obj){num++;
Parallel.For由于是并行运行的,所以会同时访问全局变量
num,为了得到正确的结果,要使用lock,此时来看看运行结
果:
是不是大吃一惊啊?
Parallel.For竟然用了15秒多,而for跟之前的差不多。
这主要是由于并行同时访问全局变量,会出现资源争夺,大多数时间消耗在了资源等待上面。
一直说并行,那么从哪里可以看出来Parallel.For是并行执行的呢?
下面来写个测试代码:
Parallel.For(0,100,i=>
Console.Write(i+"
\t"
从0输出到99,运行后会发现输出的顺序不对,用for顺序
肯定是对的,并行同时执行,所以会出现输出顺序不同的情况。
2、Parallel.Foreach
这个方法跟Foreach方法很相似,想具体了解的,可以XX些资料看看,这里就不多说了,下面给出其使用方法:
Listint>
list=newListint>
list.Add(0);
Parallel.ForEach(list,item=>
{
DoWork(item);
二、Parallel中途退出循环和异常处理
1、当我们使用到Parallel,必然是处理一些比较耗时的操作,当然也很耗CPU和内存,如果我们中途向停止,怎么办呢?
在串行代码中我们break一下就搞定了,但是并行就不是这么简单了,不过没关系,在并行循环的委托参数中提供了一个ParallelLoopState,
该实例提供了Break和Stop方法来帮我们实现。
Break:
当然这个是通知并行计算尽快的退出循环,比如并行计算正在迭代100,那么break后程序还会迭代所有小于100的。
Stop:
这个就不一样了,比如正在迭代100突然遇到stop,那它啥也不管了,直接退出。
下面来写一段代码测试一下:
publicvoidParallelBreak()
ConcurrentBagint>
Parallel.For(0,1000,(i,state)=>
if(bag.Count==300)
state.Stop();
return;
bag.Add(i);
Bagcountis"
+bag.Count+"
"
+stopWatch.ElapsedMilliseconds);
这里使用的是Stop,当数量达到300个时,会立刻停止;
可以看到结果"
Bagcountis300"
,如果用break,可能结果是300多个或者300个,大家可以测试一下。
2、异常处理首先任务是并行计算的,处理过程中可能会产生n多的异常,那么如何来获取到这些异常呢?
普通的Exception并不能获取到异常,然而为并行诞生的AggregateExcepation
就可以获取到一组异常。
这里我们修改Parallel.Invoke的代码,修改后代码如下:
thrownewException("
Exceptionintask1"
Exceptionintask2"
}publicvoidParallelInvokeMethod()
try
catch(AggregateExceptionaex)
foreach(varexinaex.InnerExceptions)
Console.WriteLine(ex.Message);
catch(Exceptionex)
顺序调用方法我把异常处理写一起了,这样只能捕获Run1的异常信息,大家可以分开写。
捕获AggregateException异常后,用foreach循环遍历输出异常信息,可以看到两个异常信息都显示了。
点击这里,下载源码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 天玩转 c# 并行 多线程 编程 一天 认识 parallel
![提示](https://static.bdocx.com/images/bang_tan.gif)