c# - 上一个任务完成后调用异步方法
问题描述
我最近了解了 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));
}
我遇到的问题是 ContinueWithTask<Task<TResult>>
在这种情况下返回一种类型,因为它将我的异步调用包装在另一个任务中。我发现的唯一解决方案是做这样的事情:
public static async Task<TResult> DoWork<T, TResult>(T value)
{
return await await Foo(value).ContinueWith(fooResult => Bar<TResult>(fooResult.Result));
}
但这看起来不对,迫使我等待它。有没有更好的方法来处理这种情况?
这些电话在幕后也发生了很多事情,所以如果我采取了错误的方法或者我的直觉让我误入歧途,我应该坚持我原来的方法,请告诉我为什么这样我可以学习和改进。谢谢!
解决方案
你很亲密。你UnWrap
最后错过了方法。
public static async Task<TResult> DoWork<T, TResult>(T value)
{
return await await Foo(value).ContinueWith(fooResult => Bar<TResult>(fooResult.Result)).UnWrap();
}
但实际上,您所做ContinueWith
的并不比以前使用await
. 我相信这await
只是ContinueWith
. 我个人觉得await
更容易阅读。
推荐阅读
- c++ - 为什么 std::atomic_fetch 将指针作为其输入参数
- c# - UTF8 中的 WebClient DownloadString 不返回法语字符
- amazon-web-services - 如何使用 Node.js 从 AWS Lambda 中的 /tmp 文件夹将 WAV 文件上传到 S3
- html - 我怎么把
内容 在最小高度的 div 底部? - javascript - a11y 可作为按钮访问的表单输入
- haskell - 在 Haskell 中建模异构图
- jquery - 使用 Metalclone 克隆部分,将所有新项目放入错误的部分
- sql - 如何在 SQL Server 中对表的列进行哈希处理?
- javascript - 是否可以使用 2 个工厂函数来填充 1 个实例?
- c# - 如何安全地反序列化密钥/数据格式 JSON 响应