c#多线程编程笔记4.doc
上传人:qw****27 上传时间:2024-09-12 格式:DOC 页数:9 大小:60KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

c#多线程编程笔记4.doc

c#多线程编程笔记4.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://blog.csdn.net/davyfamer/archive/2007/02/12/1508601.aspx"c#多线程编程笔记4a)使用Monitor类Monitor类提供了锁定部分代码的简单机制,只要把受保护的代码包装在Monitor.Enter与Monitor.Exit代码块中就行了。Monitor.Enter方法与Monitor.Exit方法都有一个参数。Monitor.Enter(object[obj]);Monitor.Exit(object[obj]).这个参数就是需要Monitor锁定的对象,它应该是一个引用类型,而不是值类型。Monitor具有以下功能:(摘自MSDN)它根据需要与某个对象相关联。它是未绑定的,也就是说可以直接从任何上下文调用它。不能创建Monitor类的实例。例子6:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;namespaceConsoleApplication1{publicclassMonitorClass6{protectedstaticintm_iCounter=0;publicvoidIncrement(){m_iCounter++;}publicintCounter{get{returnm_iCounter;}}}publicclasstest{publicMonitorClass6mc6=newMonitorClass6();publicvoidincreseMC6(){Monitor.Enter(mc6);//进入临界区try{mc6.Increment();Console.WriteLine("线程{0}的值为{1}",Thread.CurrentThread.Name,mc6.Counter);}finally{Monitor.Exit(mc6);//退出临界区}}}publicclassMainEntryPoint{publicstatictestmyTest=newtest();publicstaticvoidMain(){ThreadStartts1=newThreadStart(execute);Threadt1=newThread(ts1);t1.Name="Thread1";ThreadStartts2=newThreadStart(execute1);Threadt2=newThread(ts2);t2.Name="Thread2";t1.Start();t2.Start();Console.Read();}publicstaticvoidexecute(){for(inti=0;i<5;i++){myTest.increseMC6();}}publicstaticvoidexecute1(){for(inti=0;i<5;i++){myTest.increseMC6();}}}}执行结果如下:可以看到它没有经过顺序上的紊乱就达到10;如果我们把两个有带有Monitor注释掉,结果会变成下图所示(您机子上的结果也许顺序不一样):可以看出,由于我们没有对临界资源加以控制,而形成了我们不需要的“脏”数据!也许细心的你会发现这个Monitor类的形式与使用LOCK关键字基本一致,但我认为它比lock关键字强大一些,因为Monitor类还具有TryEnter(试图获取指定对象的排他锁)、Wait(释放对象上的锁并阻止当前线程)、Pulse(能知等待队列中的线程锁定对象状态的更改)以及PulseAll(通知所有的等待线程的对象状态已改变)等方法。TtyEnter其方法的重载:Monitor.TryEnter(Object):试图获得指定对象的排他锁Monitor.TryEnter(Object,Int32):在指定的毫秒数内尝试获取指定对象上的排他锁Monitor.TryEnter(Object,TimeSpan):在指定的时间量内尝试获取指定对象上的排他锁将例子6的increseMC6方法改为如下:publicvoidincreseMC6(){if(Monitor.TryEnter(mc6))//进入临界区{try{mc6.Increment();Console.WriteLine("线程{0}的值为{1}",Thread.CurrentThread.Name,mc6.Counter);}fi