Если вы хотите использовать 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)
.