2015-05-22 3 views
1

Мне нужно создать механизм, который ждет завершения процедуры IAsycnResult. Как я могу достичь этого?Подождите, пока функция IAsyncResult не будет завершена

IAsyncResult result = _contactGroupServices.BeginDeleteContact(
    contactToRemove.Uri, 
    ar => 
     { 
     try 
     { 
      _contactGroupServices.EndDeleteContact(ar); 
     } 
     catch (RealTimeException rtex) 
     { 
      Console.WriteLine(rtex); 
     } 
     }, 
     null); 
+0

Вы можете закончить вам метод, с помощью .Result или .Wait(), или использование ждать, если вы находитесь в методе асинхронного – cdie

+1

это? result.AsyncWaitHandle.WaitOne(); –

+0

Я не в асинхронном методе. Как я могу сделать иначе? –

ответ

0

Я не имею ни малейшего представления, что является целью этого метода _contactGroupServices.BeginDeleteContact. Но давайте попробуем написать шаблон для его

Func<object> doWork =() => 
{ 
    return _contactGroupServices.BeginDeleteContact(<your parameters>) 

}; 


AsyncCallback onWorkDone = (ar) => 
{ 
    //work done implementation 
}; 

IAsyncResult asyncResult = doWork.BeginInvoke(onWorkDone, null); 

asyncResult.AsyncWaitHandle.WaitOne(); 

var result = doWork.EndInvoke(asyncResult); 
1

Задача фабрика имеет метод только для этого: Task.Factory.FromAsync.

var task = Task.Factory.FromAsync(
    contactGroupServices.BeginDeleteContact(contactToRemove.Uri), 
    ar => 
    { 
     try 
     { 
      _contactGroupServices.EndDeleteContact(ar); 
     } 
     catch (RealTimeException rtex) 
     { 
      Console.WriteLine(rtex); 
     } 
    }); 

Вы можете блокировать до тех пор, пока не будет сделано по телефону task.Wait, но это тупик в большинстве случаев (если вызывается из потока пользовательского интерфейса, например).

Вы можете поместить его в асинхронном методе:

async Task M() 
{ 
    ... 
    await Task.Factory.FromAsync(
     contactGroupServices.BeginDeleteContact(contactToRemove.Uri), 
     ar => 
     { 
      try 
      { 
       _contactGroupServices.EndDeleteContact(ar); 
      } 
      catch (RealTimeException rtex) 
      { 
       Console.WriteLine(rtex); 
      } 
     }); 
    ... 
} 
Смежные вопросы