c# - 等待等待与解包()

标签 c# async-await

给定一个方法,例如

public async Task<Task> ActionAsync()
{
    ...
}

有什么区别

await await ActionAsync();

await ActionAsync().Unwrap();

如果有的话。

最佳答案

Unwrap() 创建一个新的任务实例,代表每次调用的整个操作。与 await 相比,以这种方式创建的任务与原始内部任务不同。查看Unwrap()文档,并考虑以下代码:

private async static Task Foo()
{
    Task<Task<int>> barMarker = Bar();

    Task<int> awaitedMarker = await barMarker;
    Task<int> unwrappedMarker = barMarker.Unwrap();

    Console.WriteLine(Object.ReferenceEquals(originalMarker, awaitedMarker));
    Console.WriteLine(Object.ReferenceEquals(originalMarker, unwrappedMarker));
}

private static Task<int> originalMarker;
private static Task<Task<int>> Bar()
{
    originalMarker = Task.Run(() => 1);;
    return originalMarker.ContinueWith((m) => m);
}

输出是:

True
False

使用 .NET 4.5.1 的基准更新: 我测试了两个版本,事实证明带有双 await 的版本在内存使用方面更好。 我使用了 Visual Studio 2013 内存分析器。测试包括每个版本的 100000 次调用。

x64:

╔══════════════════╦═══════════════════════╦═════════════════╗
║ Version          ║ Inclusive Allocations ║ Inclusive Bytes ║
╠══════════════════╬═══════════════════════╬═════════════════╣
║ await await      ║ 761                   ║ 30568           ║
║ await + Unwrap() ║ 100633                ║ 8025408         ║
╚══════════════════╩═══════════════════════╩═════════════════╝

x86:

╔══════════════════╦═══════════════════════╦═════════════════╗
║ Version          ║ Inclusive Allocations ║ Inclusive Bytes ║
╠══════════════════╬═══════════════════════╬═════════════════╣
║ await await      ║ 683                   ║ 16943           ║
║ await + Unwrap() ║ 100481                ║ 4809732         ║
╚══════════════════╩═══════════════════════╩═════════════════╝

关于c# - 等待等待与解包(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34816628/

相关文章:

c# - 通过 Lambda Func 发出 Http 请求

c# - 如何使用 C# 生成 PNG 文件?

c# - Blazor WA 托管 - Azure AppService 上的 401 未经授权

c# - Windows 10 IoT Core 和 UWP 中 AppDomain 缺失或已失效

c# - 连接到 Oracle DB 时,异步等待 Polly 代码抛出错误

javascript - 从 selenium webdriver promise 获得最终输出的简洁方法

c# - GC、Finalize() 和 Dispose 之间的关系是什么?

c# - 如何在不运行异步的情况下返回任务类型<mytype>

c# - 异步/等待的用例是什么? [复制]

c# - 重构异步/等待并行处理