inw*_*nis 1 .net c# asynchronous
试图理解流和async/await.如果我正确地await将执行返回给调用者,那么我希望下面代码的结果是:
before calling async ReadToEnd
after the call to ReadToEnd
before calling async ReadToEnd
after the call to ReadToEnd
Run Code Online (Sandbox Code Playgroud)
但它是这样的
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
Run Code Online (Sandbox Code Playgroud)
似乎在调用时使用StreamReader带有FileStream下面的a 确实返回到调用者 StreamReader.ReadToEndAsync(),但是当使用StreamReader带有MemoryStream下面的时它不起作用.
试图了解发生了什么事我读过的.NET源代码,来到在调用conculssion StreamReader.ReadToEndAsync()与MemoryStream下最终调用ReadAsync()(来源上BaseStream).在的情况下MemoryStream的ReadAsync()仅仅是不是一个真正的asynhnornous方法,因此不会返回给调用者.
我的理解是否正确?
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());
}
}
Run Code Online (Sandbox Code Playgroud)
await 如果等待的东西没有同步完成,则只返回执行给调用者.是的,async方法可以选择同步完成,因为:
MemoryStream是总是同步的,所以它始终做到这一点.
FieStream相反,可能会或可能不会同步完成,具体取决于缓冲区中可用的数据等.
关于是否返回呼叫者的决定是由GetAwaiter().IsCompleted(由Task)来决定的.IsCompleted.