您的位置:首页 > 编程语言 > C#

C# 5.0 与 .Net 4.5 学习(四)SpinLock自旋锁&WaitHandle

2015-11-02 15:35 357 查看
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:未完,内容是看英文版自己翻译的,非原创,翻译不好勿喷。无聊中...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: