我应该如何将返回非泛型任务的函数转换为 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
与缓存已经完成的 Task
(Task.CompletedTask
是什么)有什么实际不同的情况,虽然我很想了解任何东西。
在this article的基础上,你可以直接把任何异步方法从Task
改成ValueTask
,但是一定要注意文中提到的它的使用模式;具体来说:
- 多次等待实例。
- 多次调用 AsTask。
- 使用这些技术中的一种以上来使用实例。
如果您需要将结果返回为 Task
/ Task<TResult>
,您应该使用 .AsTask()
.
我正在编写一些代码,在内存中构建一个缓冲区,然后在缓冲区填满时将其清空到 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
与缓存已经完成的 Task
(Task.CompletedTask
是什么)有什么实际不同的情况,虽然我很想了解任何东西。
在this article的基础上,你可以直接把任何异步方法从Task
改成ValueTask
,但是一定要注意文中提到的它的使用模式;具体来说:
- 多次等待实例。
- 多次调用 AsTask。
- 使用这些技术中的一种以上来使用实例。
如果您需要将结果返回为 Task
/ Task<TResult>
,您应该使用 .AsTask()
.