2013-05-30 44 views
3

我有一個方法需要Action<String>。當該方法完成處理後,它將返回值爲Action<String>轉換動作<T>回調到等待

MethodWithCallback((finalResponse)=> { 
    Console.WriteLine(finalResponse); 
}); 

我想在web.api異步控制器中使用它。我如何包裝這種方法,所以我可以用await這種方法以async的方式完成。我不能修改方法本身,它是在一個遺留的代碼庫中。

我想做什麼就能做的是

String returnValue = await MyWrapperMethodThatCallsMethodWithCallback(); 
+0

我會考慮修改方法本身;以其目前的設計,它無法報告錯誤。 –

回答

11

您可以利用TaskCompletionSource類,並且在一般的方式解決問題:

Task<T> AsAsync<T>(Action<Action<T>> target) { 
    var tcs = new TaskCompletionSource<T>(); 
    try { 
     target(t => tcs.SetResult(t)); 
    } catch (Exception ex) { 
     tcs.SetException(ex); 
    } 
    return tcs.Task; 
} 

你不這樣必須修改您的MethodWhitCallback

var result = await AsAsync<string>(MethodWithCallback); 
Console.WriteLine(result); 
+2

你的代碼有點令人困惑,因爲在正常情況下,'Main()'不能是'async'。另外,您應儘可能避免使用「異步無效」方法。 – svick

+0

Tnx,我編輯它。該代碼是從linqpad複製的,其中Main必須具有async關鍵字以便在其中使用await關鍵字... – m0sa

+1

從2017年的問候,Main可以是現今的異步:P – m0sa