为什么MemoryStream.ReadAsync
正在使用任务,即使代码没有SELECT
或async
。我确信在这里使用await
不会提高性能,因为它不是I / O操作,而是内存操作。
看起来有些使用缓存,但它们仍然调用同步读取方法
async
那么这里的任务有什么用?
答案 0 :(得分:3)
这里的任务有什么用?
base Stream
type早于TAP。当异步方法添加到BCL时,流是一个明显的选择(异步代码是I / O操作的理想选择)。因此,决定将Stream
(和朋友)添加到基本Stream
类型。
但是,向后兼容性(一如既往)必须是优先事项。因此,基类abstract
类必须包含一个实现;它不能Stream
。基础MemoryStream
类将wrap the BeginRead
/EndRead
methods(如果派生类型实现APM),或仅call Read
on a thread pool thread。
{{1}} - 因为它知道它只处理内存缓冲区 - overrides this default thread pool behavior to just be synchronous。
答案 1 :(得分:1)
它说明了一切:
[HostProtection(ExternalThreading = true)]
[ComVisible(false)]
public override Task<int> ReadAsync
此方法是来自Stream
类的基本override
方法的public virtual Task<int> ReadAsync
。请注意,如果定义了FEATURE_ASYNC_IO
变量,则会在 中引入此覆盖逻辑:
#if FEATURE_ASYNC_IO
这是一种通过基于async
的方法实施Task
方法的新方法。它将返回已完成的任务,该任务在await
编辑时将不切换上下文并将同步执行。
在其他情况下,它将使用默认实现,它只是调用BeginEndReadAsync
- 提供异步模型的旧方法,BeginRead
/ EndRead
方法对与回调模型。< / p>