C# 5.0 与 .Net 4.5 学习(四)SpinLock自旋锁&WaitHandle
SpinLock自旋锁
如果由于垃圾回收,基于对象的锁对象开销太高,可以使用SpinLock结构。.NET 4以后版本可使用,如果你有很多个锁(如,一个列表里面的每一个节点)并且锁时间通常非常的短,使用SpinLock将很有用。你需要避免使用超过一个的SpinLock,并且不要调用任何可能阻塞的。
除了架构不同,SpinLock的使用同Monitor类非常相似。通过Enter或者TryEnter请求锁,并通过Exit释放锁。SpinLock同样也通过两个属性来提供关于它当前是否已锁的信息:IsHeld和IsHeldByCurrentThread.
WaitHandle
WaitHandle是一个抽象基类用于等待一个设置的信号。你可以等待不同的事情,因为WaitHandle是一个基类,一些类继承了它。
这章先前说明同步委托的时候就使用过WaitHandle。同步委托中的BeginInvoke方法返回一个实现IAsyncResult接口的对象。引用IAsyncResult,可以获得包含AsyncWaitHandle属性的WaitHandle。当调用WaitOne方法时,线程将会一直等待直到接收到一个关联到这个waitHandle的信号(代码文件 AsyncDelegate/Program.cs):
static void Main() { TakesAwhileDelegate d1=TakesAWhile; IAsyncResult ar=d1.BeginInvoke(1,3000,null,null); while(true) { Console.Write("."); if(ar.AsyncWaitHandle.WaitOne(50,false)) { Console.WriteLine("Can get the result now"); break; } } int result=d1.EndInvoke(ar); Console.WriteLine("result:{0}",result); }
使用WaitHandle,你可以等待一个信号(WaitOne),等待多个信号对象(WaitAll)。WaitAll和WaitAny是WaitHandle类的static成员,接收一个WaitHandle参数数组。
WaitHandle有一个SafeWaitHandle属性可以给操作系统资源指示的一个活动的操作并等待它。如,你可以指示一个SafeFileHandle来等待一个文件的I/O操作的完成,或者是如25章所示的SafeTransactionHandle,“Transactions”。类Mutex,EventWaitHandle和Semaphore都继承于WaitHandle基类,所以使用他们中任何一个。
ps:未完,内容是看英文版自己翻译的,非原创,翻译不好勿喷。无聊中...