等待await vs Unwrap()

Hatcyl

给定诸如

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

之间有什么区别

await await ActionAsync();

await ActionAsync().Unwrap();

如果有的话。

列昂尼德·瓦西列夫(Leonid Vasilev)

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         ║
╚══════════════════╩═══════════════════════╩═════════════════╝

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Xamarin使用异步/等待VS await Task.Run(在Xamarin中)

来自分类Dev

顺序等待VS继续等待

来自分类Dev

异步/等待vs ContinueWith

来自分类Dev

异步/等待vs ContinueWith

来自分类Dev

Gevent等待作业完成(联合vs等待)

来自分类Dev

Gevent等待作业完成(联合vs等待)

来自分类Dev

等待VS Promise.all

来自分类Dev

Blazor InvokeAsync vs等待InvokeAsync

来自分类Dev

iostat:await vs. svctm

来自分类Dev

JS 返回不等待 await

来自分类Dev

异步函数不等待 await

来自分类Dev

Python Popen-等待vs沟通vs CalledProcessError

来自分类Dev

Task <TResult> .Result vs等待任务

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

任务等待vs Task.WaitAll

来自分类Dev

在猫鼬中等待vs高管

来自分类Dev

Async/Await vs new Promise(resolve,reject)

来自分类Dev

与ConfiguredTaskAwaitable的Unwrap等效是什么?

来自分类Dev

什么是ecryptfs-unwrap-passphrase?

来自分类Dev

您如何多次.unwrap()元素?

来自分类Dev

jQuery unwrap()刺裂问题

来自分类Dev

什么是ecryptfs-unwrap-passphrase?

来自分类Dev

与ConfiguredTaskAwaitable的Unwrap等效是什么?

来自分类Dev

如何使用await / async等待资源

来自分类Dev

是否可以在继续之前等待内部的“ await”?

来自分类Dev

Async Await 等待所有结果并继续

来自分类Dev

React – Async / Await 似乎没有等待

来自分类Dev

Nodejs - Await 不等待方法先执行

来自分类Dev

开玩笑:await vs setImmediate vs useFakeTimers vs new Promise(setImmediate)