Я создал следующий пример, чтобы обернуться вокруг использования Task.Factory.FromAsync.В соответствии с документами такой синтаксис должен работать, но, кроме того, что он прекрасно компилируется, он всегда возвращает 0 байтов, в то время как встроенный ReadAsync работает отлично.Кто-нибудь знает, почему это не работает так, как я ожидал?
class Program
{
static async Task Main(string[] args)
{
var stream = new MemoryStream();
await await Task.WhenAny(
Task.Run(async() => await WriteStream(stream)),
Task.Run(async() => await ReadStream(stream)));
}
private static async Task ReadStream(MemoryStream stream)
{
var buffer = new byte[1024];
while (true)
{
// this version does not work
var read = await Task.Factory.FromAsync(stream.BeginRead, stream.EndRead, buffer, 0, buffer.Length, null);
// this version works
// var read = await stream.ReadAsync(buffer,0, buffer.Length);
if(read == 0)
continue;
Console.WriteLine($"bytes read: {read}.");
Console.WriteLine($"message: {Encoding.UTF8.GetString(buffer).Trim((char)0)}.");
Console.WriteLine($"Waiting to receive bytes...");
}
}
private static async Task WriteStream(MemoryStream stream)
{
Console.WriteLine($"Waiting for keyboard input.");
while (Console.ReadLine() is var input && input != "x")
{
var buffer = Encoding.UTF8.GetBytes(input);
await stream.WriteAsync(buffer, 0, buffer.Length);
Console.WriteLine($"Waiting for keyboard input.");
}
}
}