我应该如何将返回非泛型任务的函数转换为 ValueTask?

How should I convert a function returning a non-generic Task to ValueTask?

我正在编写一些代码,在内存中构建一个缓冲区,然后在缓冲区填满时将其清空到 TextWriter。大多数时候,角色会直接进入缓冲区(同步),但偶尔(每 4kb 一次)我需要调用 TextWriter.WriteAsync.

the System.Threading.Tasks.Extensions package there only appears to be a ValueTask<T> 结构中,没有非泛型 ValueTask(没有类型参数)。为什么没有 ValueTask,如果我需要将返回非泛型 Task 的方法(即 void 方法的异步等价物)转换为 ValueTask?

在黑暗中拍摄,但我认为这是因为 Task.CompletedTask 足以应对大多数 non-generic 情况。

考虑 ValueTask<T> 的一种方法是将 Task<T>T 结合(分别用于异步和同步情况)。因此,non-generic ValueTask 将是 Task 的并集......什么都没有,所以只是 Task.

我想不出 non-generic ValueTask 与缓存已经完成的 TaskTask.CompletedTask 是什么)有什么实际不同的情况,虽然我很想了解任何东西。

this article的基础上,你可以直接把任何异步方法从Task改成ValueTask,但是一定要注意文中提到的它的使用模式;具体来说:

  • 多次等待实例。
  • 多次调用 AsTask。
  • 使用这些技术中的一种以上来使用实例。

如果您需要将结果返回为 Task / Task<TResult>,您应该使用 .AsTask().