我最近了解了Task.ContinueWith,并正在尝试将其应用于我现有的一些代码中以提高性能。我有这样的东西:
public static async Task<TResult> DoWork<T, TResult>(T value)
{
var fooResult = await Foo(value);
return await Bar<TResult>(fooResult);
}
private static Task<MyClass> Foo<T>(T value)
{
return GetMyClassFromValueAsync(value);
}
private static Task<TResult> Bar<TResult>(MyClass myClass)
{
return myClass.DoOperationAsync();
}
并且一直认为我可以通过执行以下操作来改善它:
public static Task<TResult> DoWork<T, TResult>(T value)
{
return Foo(value).ContinueWith(fooResult => Bar<TResult>(fooResult.Result));
}
我遇到的问题是,在这种情况下,ContinueWith返回Task<Task<TResult>>
类型,因为它将我的异步调用包装在另一个任务中。我发现的唯一解决方案是执行以下操作:
public static async Task<TResult> DoWork<T, TResult>(T value)
{
return await await Foo(value).ContinueWith(fooResult => Bar<TResult>(fooResult.Result));
}
但是那看起来是错误的,迫使我等待它。有没有更好的方法来处理这种情况?
这些电话在幕后发生了很多事情,因此,如果我采用了错误的方法,或者我的直觉使我误入歧途,我应该坚持原来的方法,请让我知道为什么,这样我就可以学习和改进。谢谢!
您非常亲密。您最后缺少UnWrap
方法。
您正在寻求将承诺链接在一起并返回最终结果,为此有一个扩展方法Unwrap
。