- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
尝试理解流和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.ReadToEndAsync()
时,使用带有 FileStream
的 StreamReader
确实返回给调用者,但它确实将 StreamReader
与下面的 MemoryStream
一起使用时不起作用。
为了了解发生了什么,我阅读了 .NET 源代码并得出结论,最终使用 MemoryStream
调用 StreamReader.ReadToEndAsync()
在 BaseStream 上调用 ReadAsync()
( source )。在 MemoryStream
的情况下,ReadAsync()
并不是真正的异步方法,因此不会返回给调用者。
我的理解正确吗?
using System;
using System.Text;
using System.Linq;
using System.IO;
using System.Threading.Tasks;
static class Program
{
public static void Main(string[] args)
{
var longString = new string(Enumerable.Repeat('x', 100000000).ToArray());
File.WriteAllText("bigFile.txt", longString, Encoding.UTF32);
StreamReader fileStreamReader = new StreamReader(File.OpenRead(@"bigFile.txt"));
Console.WriteLine("before calling async ReadToEnd");
var task = ReadToEnd(fileStreamReader);
Console.WriteLine("after the call to ReadToEnd");
byte[] bytes = Encoding.UTF32.GetBytes(longString);
StreamReader memoryStreamReader = new StreamReader(new MemoryStream(bytes));
Console.WriteLine("before calling async ReadToEnd");
var task2 = ReadToEnd(memoryStreamReader);
Console.WriteLine("after the call to ReadToEnd");
fileStreamReader.Dispose();
memoryStreamReader.Dispose();
}
static async Task ReadToEnd(StreamReader streamReader)
{
string allText = await streamReader.ReadToEndAsync();
Console.WriteLine("after await in ReadToEnd. streamReader.BaseStream.GetType(): " + streamReader.BaseStream.GetType());
}
}
最佳答案
await
只有在等待的事情没有同步完成时才将执行返回给调用者。是的,async
方法可以选择同步完成,因为:
MemoryStream
是总是同步的,所以它总是这样做。
FileStream
,相比之下,可能会也可能不会同步完成,这取决于缓冲区中可用的数据等。
关于是否返回调用者的决定由 GetAwaiter().IsCompleted
驱动,它(对于 Task
)归结为 .IsCompleted
。
关于c# - await 不会按预期使用 StreamReader.ReadToEndAsync() 返回给调用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44517607/
我从 Controller 中的异步操作调用此 getJson() 函数。我有一个大文件列表,每个文件需要几秒钟的时间来处理 ReadToEndAsync() 。尽管我正在等待 ReadToEndAs
如果我从 Windows Phone 8 上的 UI 线程调用等待 ReadToEndAsync,ReadToEndAsync 将在什么上下文中执行其工作?任务是由 UI 线程本身排队等待处理,还是由
我在使用 StreamReader.ReadToEndAsync() 时遇到了一些问题; //some get response code ... using (var response = getR
我正在使用 .NET 4.5 构建一个 SOCKS 代理检查器,一切正常,除非其中一个 SOCKS 代理非常慢并且需要 100 多秒才能响应。我想在几个阶段(ConnectAsync、ReadToEn
尝试理解流和async/await。如果我正确理解 await 将执行返回给调用者,那么我预计下面代码的结果是: before calling async ReadToEnd after the ca
有谁知道为什么 ReadLineAsync 和 ReadToEndAsync 比同步对应的 ReadLine 和 ReadToEnd 慢得多?如果我正在等待多个调用,我可以理解这种缓慢,但事实并非如此
我是一名优秀的程序员,十分优秀!