网多线程编程(误用点分析)
一共享变量问题
错误写法:
所有的任务可能会共享同一个变量,所以输出结果可能会一样。
{的公共静态void Error()(int I=0;i10i){ 0任务。运行(()={控制台写入行(“{ 0 }”,I);});}}正确写法:
将变量我赋给局部变量温度,使得每一个任务使用不同的我值。
公共静态void Right(){ for(int I=0;I ^ 10I){ int temp=I;任务。运行(()={控制台写入行(“{ 0 }”,temp);});}}2 不要清理挂起任务所需资源
错误写法:
异步输出文本内容,所以在未使用完StreamReader的时候,变量立体弧度已经离开它的作用域,调用处理方法。
使用(流阅读器Sr=新的流阅读器(@ ' d : \说明. txt,编码。默认值)){任务。运行(()={控制台WriteLine(“”输出:{0} ',Sr . ReadLine());});}}正确写法:
公共静态void Right(){ 0使用(流阅读器Sr=新的流阅读器(@ ' d : \说明. txt,编码。默认值){ var task=Task .运行(()={控制台WriteLine(“”输出:{0} ',Sr . ReadLine());});任务等待();}}3 避免锁定这个,类型(类型),字符串
正确的做法:定义一个目标类型的私有只读字段,锁定之。
四关于等待句柄等待的等待句柄的数目必须小于等于64个
公共静态无效错误(){手动重置事件[]手动事件=新手动重置事件[65];尝试{ for(int I=0;I 65I){ var temp=I;任务。运行(()={手动事件[温度]=新的手动事件(假);控制台写入行(“{ 0 }”,temp);手动事件[临时]。set();});} WaitHandle .等待所有(手动事件);}捕获(异常ae) {控制台WriteLine(即。消息);}}5 无法捕获异常的情形
尝试{可变任务=任务.运行(()={引发新异常('抛异常');});//如果将下面这行代码注掉,则无法抛出异常任务等待();}catch(异常例如){控制台.WriteLine(例如。消息);}6 是否该释放工作资源
建议调用处置,但不调用也不是一个严重的错误。
注意在工作任务处于某些状态时是不允许释放资源的,否则会报错。
公共静态void catch异常(){尝试{ Console .WriteLine(“”开始');定义变量任务=任务。运行(()={//引发新的异常('抛异常');});//注掉下面这行代码,观察异常结果//任务等待();任务dispose();控制台WriteLine(“”结束');} catch(异常例如){控制台.WriteLine(例如。消息);} }
七死锁演示
假设tsak1和任务2都在获得第二个锁(对tsak1来说它请求的第二个锁是LockedObj2,而对任务2来说则是LockedObj1)之前成功获得了第一个锁,就会发生死锁。
私有静态只读对象LockedObj1=新对象();私有静态只读对象LockedObj2=新对象();公共静态void LockShow(){ var Task 1=Task 1 .运行(()={ lock (LockedObj1) { Console .写行(' get LockedObj1 ');锁定(锁定J2){ 0控制台WriteLine('get LockedObj2 . ');} } });var task2=任务。运行(()={ lock(lockedoj2){ Console .写行(' get LockeDobJ2 ');锁定(LockedObj1){ 0控制台写入行(' get lockdobj 1…');} } });}多次运行可得下面两种结果:第一个图是未发生死锁的情形,第二个图是发生死锁的情形。
8不要调用线程。流产方法。
工作没有提供流产方法,使用新的第三方物流(TPL).NET 4.0以后),不会想到这个问题,一般使用CancellationToken来控制取消任务。
9 确保共享变量是安全的
反复运行,可观察到不一样的结果,下图所示。
public static void Func(){ string s=' ASDFGH ';平行。调用(()={ s=s.Replace('A ',' 1 ');s=s .替换(' S ',' 1s ');},()={ s=s .替换(' A ',' 2 ');s=s .替换(' S ',' 2s ');},()={ s=s .替换(' A ',' 3 ');});控制台。写线;}
10处理器超额认购和认购不足
public static void Func(){ parallel loops po=new parallel loops();//过度应用,处理器只有4个逻辑核,结果是并行度设为10,所有逻辑核都在工作,等待任务数大于0 . po . maxdegrees of Parallelism=10;//应用程序不足。处理器有四个逻辑内核,但并行度指定为3,一个空闲内核未被占用(也可能被其他线程占用)。假设当并行度指定为3) po时,另一个内核空闲。最大并行度=3;Listint list=new Listint();平行。ForEach(list,po,m={//business });}以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!
版权声明:网多线程编程(误用点分析)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。