Я пытаюсь найти способ предоставить эксклюзивный доступ к ресурсу, в то же время предоставляя информацию о состоянии блокировки (_isWorking) для чтения другими классами.
Вот что ядо сих пор придумали:
private int _isWorking = 0;
public bool IsWorking
{
get { return Interlocked.CompareExchange(ref _isWorking, 0, 0) == 1; }
}
public void LaunchProcess()
{
if (Interlocked.CompareExchange(ref _isWorking, 1, 0) == 0)
{
try
{
DoExpansiveProcess();
}
finally
{
Interlocked.Exchange(ref _isWorking, 0);
}
}
}
public void DoExpansiveProcess()
{
Thread.Sleep(30000);
}
Он не работает точно как блокировка, поскольку второй поток, увидев, что поток уже выполняет процесс, просто выйдет из метода и ничего не сделает.
Это правильный способ сделать это или есть какая-то структура C # 3.5, более приспособленная для этой цели?
И как реализовать сценарий «реальной» блокировки, при котором второй поток все равно будет выполнятьсяметод после первого завершается, предоставляя информацию о состоянии?