MemoryStream ReadAsync中的任务有什么用?

时间:2017-07-24 17:55:11

标签: c# asynchronous async-await task-parallel-library

为什么MemoryStream.ReadAsync正在使用任务,即使代码没有SELECTasync。我确信在这里使用await不会提高性能,因为它不是I / O操作,而是内存操作。

看起来有些使用缓存,但它们仍然调用同步读取方法

async

那么这里的任务有什么用?

2 个答案:

答案 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>