我想调用以下代码:
public async ValueTask UserGivenClaim(AppUser user, Organization org, string claim)
{
var notify = new NotifyClaims(user, org);
await notify.SetReplyToTask(null, org);
await NotificationQueue.PushValueTask(notify);
}
在上面的代码中,
SetReplyToTask()
返回一个Task,PushValueTask()
返回一个ValueTask。从性能的角度来看,99% 的时间都会执行 if 检查是否正确并返回。所以 99% 的时间它都不会调用其中的 Task 方法。声明 SetReplyToTask()
异步让我可以调用
UserGivenClaim
这会是最快的代码吗?我担心我已经放弃了 ValueTask 这样做的优势。另一种可能性是使 await notify.SetReplyToTask(null, org);
成为 ValueTask。如果 99% 的时间它都没有调用任务,那么这是我应该使用 ValueTask 的时候吗?
notify.SetReplyToTask()
方法调用
await
返回ValueTask
方法不必全部是相同的可等待类型,即仅async
或仅ValueTask
。使用 Task
的要点之一是异步方法何时将同步完成,正如您所承认的:
如果 99% 的时间它都没有调用任务,这是我应该做的时候吗? 使用 ValueTask?所以如果
当
ValueTask
PushValueTask()
虽然 ValueTask
将使
SetReplyToTask()
在大多数情况下同步完成(除非其中的两个方法调用之间存在一些有趣的隐藏依赖关系)。
也就是说,文档列出了在放弃默认值之前应满足的另外两个“要求”Task
方法可能会返回此值类型的实例 其操作结果将同步可用,和 当预计会被
如此频繁地调用以至于成本 为每个调用分配一个新任务将是令人望而却步的。 您没有针对您的用例提及这两个(频繁调用、分配成本),因此我认为您考虑使用
而不是UserGivenClaim
Task
可能会不必要地过度优化。
在文档中,您可以看到
ValueTask
有很多限制,而Task
则没有,这使得两者之间的选择比“大多数情况下是否同步完成”更加微妙。