2014-09-26 2 views
0

У меня есть нить. В какой-то момент я хочу проверить, свободен ли какой-то замок. Если это бесплатно, я хочу, чтобы поток продолжался по-своему. Если он не является бесплатным, я хочу подождать, пока он станет бесплатным, но на самом деле не приобретет блокировку.Подождите, пока выйдет замок.

Вот мой код до сих пор:

private object LockObject = new Object(); 

async void SlowMethod() { 
    lock (LockObject) { 
    // lotsa stuff 
    } 
} 

void AppStartup() { 
    this.SlowMethod(); 
    UIThreadStartupStuff(); 
    // now, I want to wait on the lock. I don't know where/how the results 
    // of SlowMethod might be needed. But I do know that they will be needed. 
    // And I don't want to check the lock every time. 
} 
+0

См http://stackoverflow.com/questions/12033725/c-sharp-how-to-detect-an-object-is-already-locked – dizel3d

+0

@ dizel3d Это другая операция. Определение того, свободен ли замок, отличается от ожидания до его освобождения без приобретения блокировки. – Servy

+0

Если ваш примерный код является репрезентативным для вашей реальной проблемы, вы можете просто «Подождать» задачи, возвращенной 'SlowMethod'. –

ответ

2

Я думаю, что у вас есть классическая проблема XY. Я предполагаю, что вы хотите запустить Задачу с вами SlowMethod, а затем Продолжить ее с UIThreadStartupStuff является нитью пользовательского интерфейса.

Task.Factory.StartNew(()=>SlowMethod()) 
    .ContinueWith(t=>UIThreadStartupStuff(), TaskScheduler.FromCurrentSynchronizationContext()); 

или асинхронном/ждать (сделать свой SlowMethod вернуть Task)

try 
{ 
    await SlowMethod(); 
} 
catch(...) 
{} 
UIThreadStartupStuff(); 
-1

я не мог получить то, что вы хотите достичь, но почему бы не ждать на замке «правильно»? В конце концов, это явный признак того, что замок свободен, если вы можете его принять. Кроме того, вы можете немедленно его освободить, если это важно.

void AppStartup() { 
    this.SlowMethod(); 
    UIThreadStartupStuff(); 

    // now, I want to wait on the lock. I don't know where/how the results 
    // of SlowMethod might be needed. But I do know that they will be needed. 
    // And I don't want to check the lock every time. 

    lock (LockObject) { 
     // nothing, you now know the lock was free 
    } 

    // continue... 

}

2

Вы не хотите использовать блокировку здесь. Вам нужно событие. Либо ManualResetEvent, либо AutoResetEvent.

Помните, что замки используются для взаимного исключения. События используются для сигнализации.

У вас есть SlowMethod, если это делается. Например:

private ManualResetEvent DoneEvent = new ManualResetEvent(false); 

async void SlowMethod() { 
    // lotsa stuff 
    // done with lotsa stuff. Signal the event. 
    DoneEvent.Set(); 
} 

void AppStartup() { 
    this.SlowMethod(); 
    UIThreadStartupStuff(); 

    // Wait for the SlowMethod to set the event: 
    DoneEvent.WaitOne(); 
} 
Смежные вопросы