|
使用Monitor类的方法大致一样: Monitor的常用方法:Enter和Exit都是静态方法,作用跟lock语句的两个花括号一样。 而使用 Mutex 就不需声明一个“令牌”对象了,但要实例化之后才可以使用: public class Tools { private Mutex mut = new Mutex(); private int count = 100; public void Add(int n) { mut.WaitOne(); count+=n; mut.ReleaseMutex(); } public void Delete(int n) { mut.WaitOne(); count-=n; mut.ReleaseMutex(); } } 其中的WaitOne为等待方法,一直等到Mutex 被释放为止。初始的情况下,Mutex 对象是处于释放状态的,而一旦执行了WaitOne方法之后,它 就被捕获了,一直到被调用了ReleaseMutex方法之后才被释放。 使用这三种方法都有一个要注意的问题,就是在独占代码段里面如果引起了异常,可能会使“令牌”对象不被释放,这样程序就会一直地死等下去了。 所以要在独占代码段里面处理好异常。例如下面这样的代码就是错误的: public void Add(int n) { try { mut.WaitOne(); count+=n; //....这里省略了N行代码 //....这里是有可能引起异常的代码 //....这里省略了N行代码 mut.ReleaseMutex(); } catch { Console.Writeline("error."); } } 上面的代码一旦在try和catch里面发生了异常,那么Mutex就不能被释放,后面的程序就会卡死在WaitOne()一行,而应该改成这样: public void Add(int n) { mut.WaitOne(); try { count+=n; //....这里省略了N行代码 //....这里是有可能引起异常的代码 //....这里省略了N行代码 } catch { Console.Writeline("error."); } mut.ReleaseMutex(); } 现在谈一下第二种: ManualResetEvent类,AutoResetEvent类 上面这两个类都是由EventWaitHandle类派生出来的,所以功能和调用方法都很相似。这两个类常用于阻断某个线程的执行,然后在符合条件的情况下再恢复其执行。 举个例子,你想送花给一个MM,托了一个送花的小伙子送了过去,而你希望当MM收到花之后就立即打个电话过去告诉她。
|