我怎样才能将这段代码:只允许一个线程访问C#中的资源的简单方法?
try
{
lock (lockForSomethingInUse)
{
somethingInUse = true;
// use it
}
}
finally
{
somethingInUse = false;
}
有了:
using (lockForSomething)
{
// use it
}
我怎样才能将这段代码:只允许一个线程访问C#中的资源的简单方法?
try
{
lock (lockForSomethingInUse)
{
somethingInUse = true;
// use it
}
}
finally
{
somethingInUse = false;
}
有了:
using (lockForSomething)
{
// use it
}
如果你想使用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)
。
lock()
已经产生尝试/终于在引擎盖下阻挡所以就删除它,一切都会好起来
看起来像问题被改变,因为最初没有提到'与使用(lockForSomething)'但'与锁(lockForSomething)'' – sll
此代码:
using (lockForSomething)
{
// use it
}
暗示临时当使用的代码块退出时,lockForSomething被处置。除非lockForSomething属于更广的范围(不,不!),否则不同的线程无法访问它。
即使发生异常,不会失败,因为:
lock (x) ...
是一样的:
System.Threading.Monitor.Enter(x);
try {
...
}
finally {
System.Threading.Monitor.Exit(x);
}
为什么不使用锁定语句? 'lock(lockForSomethingInUse){...}' – Peter
当你想使用锁时,有什么问题? – sll