如果您无法下载资料,请参考说明:
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