C# 同步方法的ValueTask

C# 同步方法的ValueTask,c#,asynchronous,task,valuetask,C#,Asynchronous,Task,Valuetask,我正在使用并发字典实现一个简单的查找服务来存储数据。 由于使用此服务的大多数方法都是异步的,因此我正在考虑使用ValueTask公开查找函数 伪代码: public ValueTask<string> GetResultAsync(string key) { return ValueTask.FromResult(_dictionary.FirstOrDefault(p => p.Key == key).Value } public ValueTask GetResultA

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

伪代码:

public ValueTask<string> GetResultAsync(string key)
{
 return ValueTask.FromResult(_dictionary.FirstOrDefault(p => p.Key == key).Value
}
public ValueTask GetResultAsync(字符串键)
{
返回值task.FromResult(_dictionary.FirstOrDefault(p=>p.Key==Key).Value
}
这种方法有意义吗?是否有任何警告

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

这不是公开同步操作的假异步包装的有效原因。这样做会增加不必要的开销,并且会向服务的使用者传递错误/误导性的语义。事实上,我知道这样做的唯一有效原因是,如果您正在构建基类,并且您希望派生类将重写此方法并提供真正的异步实现

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


这不是公开同步操作的假异步包装的有效原因。这样做会增加不必要的开销,并且会向服务的使用者传递错误/误导性的语义。事实上,我知道这样做的唯一有效原因是,如果您正在构建基类,并且您希望派生类将重写此方法并提供真正的异步实现。

异步方法调用轻松调用同步方法是没有意义的。如果将方法公开为异步,则必须真正做到这一点,如果IO、网络或外部解决了一些问题。此方法是否以异步方式运行?您是否考虑过提供使用异步访问的缓存的重写实现?@CaiusJard我怀疑是否会涉及任何真正的异步代码,正如您在示例中看到的,将运行的唯一代码是sync,它将只执行查找或字典修改。这没有意义,异步方法很容易调用sync方法。如果您将您的方法设置为异步—如果IO、networking或其他外部问题被解决,您必须真正做到这一点。该方法是否以异步方式运行?您是否考虑提供使用异步访问的缓存的重写实现?@CaiusJard我怀疑是否会涉及任何真正的异步代码,如您在中所看到的该示例中唯一将运行的代码是sync,它将只执行查找或字典修改。我猜您提到的两个点都是有效的,并且完全理解,非常感谢您的输入!我猜您提到的两个点都是有效的,并且完全理解,非常感谢您的输入!