【问题标题】:ValueTask for synchronous method同步方法的 ValueTask
【发布时间】:2021-02-02 15:58:14
【问题描述】:

我正在使用并发字典来实现一个简单的查找服务来存储数据。 由于使用此服务的大多数方法都是异步的,因此我正在考虑使用 ValueTask<TResult> 公开查找函数。

伪代码:

public ValueTask<string> GetResultAsync(string key)
{
 return ValueTask.FromResult(_dictionary.FirstOrDefault(p => p.Key == key).Value
}

这种方法有意义吗?有什么注意事项吗?

【问题讨论】:

  • 没有意义,异步方法调用容易调用同步方法。如果您将您的方法公开为异步,您必须真正打算这样做,如果涉及 IO、网络或外部的东西。
  • 这种方法是否以异步方式运行?您是否正在考虑提供一些使用异步访问的缓存的覆盖实现?
  • @CaiusJard 我怀疑是否会涉及任何真正的异步代码,正如您在示例中看到的那样,唯一将运行的代码将是同步的,它只会进行查找或字典修改。跨度>

标签: c# asynchronous task valuetask


【解决方案1】:

由于使用此服务的大多数方法都是异步的,因此我正在考虑使用 ValueTask 公开查找函数。

这不是公开同步操作的伪异步包装器的正当理由。这样做会增加不必要的开销,并且向服务的消费者传达错误/误导性的语义。事实上,我知道这样做的唯一正当理由是,如果您正在构建一个基类,并且您希望派生类将覆盖此方法并提供真正的异步实现。

【讨论】:

  • 我想你提到的两点都是有效的并且完全理解,非常感谢你的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多