如何在 ValueTask 中调用 Task 和 ValueTask?

问题描述 投票:0回答:1

我想调用以下代码:

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 的时候吗?

    

c# async-await valuetask
1个回答
0
投票
notify.SetReplyToTask()

方法调用

await
返回
ValueTask
方法不必全部是相同的可等待类型,即仅
async
或仅
ValueTask
使用 

Task

的要点之一是异步方法何时将同步完成,正如您所承认的:


如果 99% 的时间它都没有调用任务,这是我应该做的时候吗? 使用 ValueTask?

所以如果

    ValueTask
  1. 返回时,我们确信它在大多数情况下都会同步完成
    并且知道 
    PushValueTask()
    虽然
  2. ValueTask
  3. 返回,但也将按照您的话 99% 的时间同步完成。
    
    
    将使 
    SetReplyToTask()
itself

在大多数情况下同步完成(除非其中的两个方法调用之间存在一些有趣的隐藏依赖关系)。

也就是说,文档列出了在放弃默认值之前应满足的另外两个“要求”

Task

方法可能会返回此值类型的实例
其操作结果将同步可用,

当预计会被
如此频繁地调用

以至于成本 为每个调用分配一个新任务将是令人望而却步的 您没有针对您的用例提及这两个(频繁调用、分配成本),因此我认为您考虑使用 UserGivenClaim

而不是
Task

可能会不必要地过度优化。

文档
中,您可以看到

ValueTask

有很多限制,而Task则没有,这使得两者之间的选择比“大多数情况下是否同步完成”更加微妙。

    

© www.soinside.com 2019 - 2024. All rights reserved.