【发布时间】:2020-01-29 00:18:23
【问题描述】:
我有一个大致如下所示的异步方法:
async Task<int> ParseStream()
{
var a = await reader.ReadInt32();
var b = await reader.ReadInt32();
return a + b;
}
由于数据已经准备好,该方法大部分时间都会同步工作。
因此,用 ValueTask 替换返回类型以减少分配看起来是个好主意。
但这会调用reader.ReadInt32() return Task。
所以问题是:从内部等待某些任务的方法返回 ValueTask 是否有意义?
【问题讨论】:
-
我假设
reader和stream是相关的/相同的?如果是这样,你怎么知道“大多数时候数据已经准备好了”。如果给我一个任意的Stream,我不能假设有多少数据是现成的,所以看起来你可以做出一些你在问题中没有提到的假设? -
哦,我没有注意到这个流 - 这对这种情况并不重要。这个 Parse 方法通常在 response 已经在这里时被调用。
-
这有点像问“如果我调用的方法分配内存对我来说避免内存分配是否有意义”? (打个比方;节省内存不是
ValueTask的主要目标。)是否使用ValueTask应该取决于您的 场景使用它是否有意义(因为您限制调用者如何等待您的结果),而不是您的实现当前所依赖的。 (比如说)等待一个使用ValueTask代替ReadInt32的新实现然后才切换你的方法是没有意义的。 -
你是问返回
ValueTask<int>而不是Task<int>是否有优势? -
是的。例如,假设在某些情况下,此调用
reader.ReadInt32()会同步运行,我会将返回类型替换为 ValueTask。这种方法会在如此乐观的情况下分配吗?
标签: c# async-await valuetask