2013-04-18 4 views
-1

У меня есть этот код на WinForm:Могу ли я «заблокировать» функцию до окончания асинхронного потока?

private void buttonStart_Click(object sender, EventArgs e) 
{ 
    Task.Factory.StartNew(() => ThreadFunction()) 
     .ContinueWith(t => ThreadFunctionComplete() 
     , CancellationToken.None 
     , TaskContinuationOptions.None 
     , TaskScheduler.FromCurrentSynchronizationContext()); 

    ThreadFinished(); 
} 

, и я хотел бы начать ThreadFinished() только тогда, когда ThreadFunctionComplete() была закончена. Ну, я мог бы положить ThreadFinished() в конце ThreadFunctionComplete(), но для некоторого рабочего процесса этого не произойдет. Является ли это возможным? Может быть, вид ожидания/блокировки?

+0

Почему вы не можете использовать 'ContinueWith()' снова, с 'ThreadFinished()' на этот раз? –

+1

Какую версию C# вы используете? –

+0

Почему бы вам просто не поставить очередь в конце задачи, как вы делали с «ThreadFunctionComplete»? – Dirk

ответ

4

В принципе, вы можете просто позвонить ContinueWith дважды:

Task.Factory.StartNew(....) 
      .ContinueWith(...) 
      .ContinueWith(...) 
1

Вы можете использовать Wait(), но он будет блокировать текущий поток ...

Task.Factory.StartNew(...).Wait(); 

Или добавить еще ContinueWith()

Task.Factory.StartNew(...).ContinueWith(t => ThreadFinished()); 
+0

'Wait' будет блокировать пользовательский интерфейс в этом случае –

+0

Да, это будет. Я это отметил. –

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