2011-11-26 60 views

回答

1

如果你想使用lock,并能要知道当前是否仅使用一个语句/变量来获取锁,则可以尝试使用以下类。他们不会因为可读性而获得任何奖励,但他们允许您使用using进行锁定,只要您想要。

class DisposableLock 
{ 
    public bool IsAcquired { get; set; } 

    class Handle : IDisposable 
    { 
     private DisposableLock parent; 

     public void Dispose() 
     { 
      parent.IsAcquired = false; 
      Monitor.Exit(parent); 
     } 
    } 

    public IDisposable Acquire() 
    { 
     var handle = new Handle(); 
     handle.parent = this; 
     handle.parent.IsAcquired = true; 
     Monitor.Enter(this); 
     return handle; 
    } 
} 

用法:

DisposableLock lockForSomething = new DisposableLock(); 
// ... 

using (lockForSomething.Acquire()) 
{ 
// do something 
} 

然后可以使用lockForSomething.IsAcquired在其他一些地方,检查是否正在使用的资源。内部类实施IDisposable是为了确保您不会意外地使用using (lockForSomething)

4

lock()已经产生尝试/终于在引擎盖下阻挡所以就删除它,一切都会好起来

+0

看起来像问题被改变,因为最初没有提到'与使用(lockForSomething)'但'与锁(lockForSomething)'' – sll

0

此代码:

using (lockForSomething) 
{ 
    // use it 
} 

暗示临时当使用的代码块退出时,lockForSomething被处置。除非lockForSomething属于更广的范围(不,不!),否则不同的线程无法访问它。

0

即使发生异常,不会失败,因为:

lock (x) ... 

是一样的:

System.Threading.Monitor.Enter(x); 
try { 
    ... 
} 
finally { 
    System.Threading.Monitor.Exit(x); 
} 

The lock statement on MSDN

相关问题