2015-05-22 200 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); 
      } 
     }); 
    ... 
}