假設我有一個異步方法...如何以功能流暢的風格同步調用任務?
public async string MyAsyncMethod() { return await AnyLongRunOperation(); }
並有我有一個通用的方法來調用同步異步方法:
public static TResult CallSynchronously<TResult>(Func<Task<TResult>> Operation)
{
var CallingTask = Task.Run(() => Operation());
CallingTask.Wait();
return CallingTask.Result;
}
接着,電話可以作出(工作正常) :
string ResultMessage = CallSynchronously(() => MyAsyncMethod());
但是,如果我想這種方法轉換成一個擴展方法來調用它在功能流利式(這樣可以避免通過一個lambda一s參數),然後我tryed這... ...
public static TResult CallSynchronously<TResult>(this Task<TResult> Operation)
{
var CallingTask = Task.Run(() => Operation.Result);
CallingTask.Wait();
return CallingTask.Result;
}
所以,現在我可以把它像...
var Result = MyAsyncMethod().CallSynchronously();
但這裏的問題是:它掛!
所以,問題是:如何以功能流暢風格同步調用任務?
我給你一個例子:你有一箇中間的Web服務,它依賴於其他Web服務來計算結果。即:不同步並不總是可能的。 –
感謝您的解釋,但問題不是'它爲什麼'掛起來,而是'如何'流利地調用它(功能風格)而不掛。 –
@NéstorSánchezA.:在你的用例中,使中間Web服務異步。除非第一次包裝它(例如'Fluent(MyAsyncMethod).CallSynchronously()'),否則沒有辦法這樣流利。 –