假设我有一个异步方法...如何以功能流畅的风格同步调用任务?
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()'),否则没有办法这样流利。 –