尝试了解流和async/await
。如果我正确地await
将执行返回给调用者,那么我希望下面代码的结果是:
before calling async ReadToEnd
after the call to ReadToEnd
before calling async ReadToEnd
after the call to ReadToEnd
但是它确实是
before calling async ReadToEnd
after the call to ReadToEnd
before calling async ReadToEnd
after await in ReadToEnd. streamReader.BaseStream.GetType(): System.IO.MemoryStream
after the call to ReadToEnd
在调用StreamReader
时,使用FileStream
下面带有StreamReader.ReadToEndAsync()
的{{1}}实际上会返回给调用方,但是当StreamReader
与{一起使用}时它不起作用{1}}下面。
试图了解发生了什么我已经阅读了.NET源代码,并得出结论,在MemoryStream
下面调用StreamReader.ReadToEndAsync()
最终会调用MemoryStream
({{3在BaseStream上。在ReadAsync()
的情况下,MemoryStream
实际上不是一个异常的方法,因此不会返回给调用者。
我的理解是否正确?
ReadAsync()
答案 0 :(得分:5)
await
只有等待未完成同步的 才会将执行返回给调用者。是的,async
方法可以选择同步完成,因为:
MemoryStream
总是同步,所以它总是这样做。
FieStream
可能会或可能不会同步完成,具体取决于缓冲区中可用的数据等。
关于是否返回来电者的决定由GetAwaiter().IsCompleted
推动,(Task
)归结为.IsCompleted
。
答案 1 :(得分:2)
在代码的第一部分中,您要从StreamReader
创建File
。当你调用streamReader.ReadToEndAsync()
时,必须首先从硬盘驱动器读取文件到内存,然后才能返回内容,这是异步完成的。
在代码的第二部分中,您要从StreamReader
创建MemoryStream
,bytes
是从streamReader.ReadToEndAsync()
构建的,已经加载到应用程序的内存中。在这种情况下,ng-class
会立即返回内容,因为数据在内存中,可以立即获取。