【发布时间】:2018-08-02 18:58:30
【问题描述】:
我正在编写一些代码,它在内存中构建一个缓冲区,然后在缓冲区填满时将其清空到 TextWriter 中。大多数时候,角色会直接进入缓冲区(同步),但偶尔(每 4kb 一次)我需要调用 TextWriter.WriteAsync。
在the System.Threading.Tasks.Extensions package 中似乎只有一个ValueTask<T> 结构,没有非泛型ValueTask(没有类型参数)。为什么没有ValueTask,如果我需要将返回非泛型Task(即void方法的异步等效)的方法转换为ValueTask,该怎么办?
【问题讨论】:
-
您希望
ValueTask有什么行为?根据定义,当结果同步可用时,可以使用ValueTask。如果没有结果,返回Task有什么意义或好处? -
@JSteward 我正在做一些事情,它在内存中构建一个缓冲区,然后在缓冲区填满时将其清空到
TextWriter中。大多数时候,角色会直接进入缓冲区(同步),但偶尔(每 4kb 一次)我需要调用TextWriter.WriteAsync。 -
我不确定您将如何从
ValueTask中受益,但文档建议 对于使用结果以外的其他用途... ValueTask可能会导致更复杂编程模型 。也许您可以使用 TPL-Dataflow 之类的东西重新设计您的解决方案,它有多种缓冲和处理数据的方法。 -
@JSteward 感谢您的建议,但您不知道这一点,但对于我的目的而言,Dataflow 太过分了,尽管我很喜欢它。我希望这段代码快速而不是分配,我愿意使用复杂的编程模型来实现这一点:)
标签: c# async-await task task-parallel-library