2015-05-22 44 views
1

我需要创建等待IAsycnResult方法直到完成的机制。 我怎样才能做到这一点?等待IAsyncResult函数,直到完成

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

可以通过。结果或.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完成,但是在大多数情况下死锁(如果从UI线程调用,例如)。

你可能希望把它的异步方法中:

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