Почему этот вызов Task.Factory.FromAsync не работает? - PullRequest
0 голосов
/ 07 марта 2019

Я создал следующий пример, чтобы обернуться вокруг использования 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.");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...