2010-05-18 2 views
2

Предположим, у меня есть метод void SomeMethod (Action callback) Этот метод выполняет некоторую работу в фоновом потоке, а затем вызывает обратный вызов. Вопрос в том, как заблокировать текущий поток до вызова callback?.NET Threading: Как подождать, пока другой поток не завершит какую-либо задачу

Существует пример

bool finished = false; 
SomeMethod(delegate{ 
finished = true; 
}); 
while(!finished) 
    Thread.Sleep(); 

Но я уверен, что там должен быть лучший способ

+0

Если вы собираетесь блокировать текущий поток до тех пор, работа на фоновом потоке не будет завершена, вы могли бы просто сделать работу на текущем потоке вместо этого? –

+0

Нет, к сожалению, я не могу выполнять работу в текущей теме. –

+0

Вы рассмотрели возможность ввода кода после ожидания внутри потока или использования обратного вызова/события? То, что вы описываете, является синхронной операцией. Может быть, больше информации? –

ответ

3

Вы можете использовать AutoResetEvent, сигнализировать ваш поток завершен.

Проверьте этот фрагмент кода:

AutoResetEvent terminateEvent = new AutoResetEvent(false); 
    bool finished = false; 
    SomeMethod(delegate 
    { 
     terminateEvent.Set(); 
    }); 
    terminateEvent.WaitOne(); 
+0

Спасибо, это работает. Работает ли он быстрее, чем поток сна? –

+0

Спин-блокировка (постоянная проверка флага в цикле while, возможно с помощью «Thread.Sleep»), скорее всего, быстрее, когда заблокированное время очень мало, в противном случае «AutoResetEvent» - это путь. –

1

Проверка на Thread.Join() будет работать

Example of this

+0

Проблема с Thread.Join заключается в том, что другой поток не завершен, когда он вызывает обратный вызов. –

Смежные вопросы