使用Async任务从文件流中读取而不是无限循环

时间:2014-09-30 10:32:08

标签: c# filestream

这是一个非常简单的程序。在我发送请求发回的常量消息的消息后,我正在尝试从控制器读出消息。第一部分是我如何设法使读取按预期工作,每次发送消息时我都可以在控制台中看到它。我想用下面的代码中的任务重新创建这个场景。我怎么没有成功这样做。

            if (success)
            {
                if (fileStreamDeviceData.CanRead)
                {
                    while(success)
                    {
                        await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, outputReportBuffer.Length);
                        for (int b = 0; b < 12; b++)
                        {
                            Console.Write(outputReportBuffer[b] + " ");
                        }
                        Console.WriteLine();

                    }
                }
            }

所以上面的部分按预期工作,除了当前正在发生的丑陋无尽的while循环。以下2个代码部分是解决方案,但它没有按预期工作,我似乎没有得到任何东西。我真的很不喜欢异步任务和东西,所以也许有人可以帮我解决下面的部分。

            if (success)
            {

                outputReportBuffer = null;
                //start async reading
                try
                {
                    outputReportBuffer = await ReadByteAsync();
                    for (int b = 0; b < outputReportBuffer.Length; b++)
                    {
                        Console.Write(outputReportBuffer[b] + " ");
                    }
                    Console.WriteLine();

                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }


    private async Task<Byte[]> ReadByteAsync()
    {
        Byte[] result = null;
        Byte[] outputReportBuffer = null;

        using (fileStreamDeviceData)
        {
            outputReportBuffer = new Byte[MyHid.Capabilities.OutputReportByteLength];

            int byteRead;
            while ((byteRead = await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, outputReportBuffer.Length)) != 0)
            {
                result = outputReportBuffer;
            }

            return result;
        }
    }

使用此代码时,我没有任何异常或任何输出。

1 个答案:

答案 0 :(得分:1)

我可能是由于很多原因,尝试在首次循环时打印内容。

调用者outputReportBuffer = await ReadByteAsync();是否在asyn方法中?如果不是,我会改为使用ReadByteAsync().Result并在ConfigureAwait(false)方法中设置ReadByteAsync()

    const int BufferSize = 100;

    private async Task<Byte[]> ReadByteAsync()
    {
        var memoryStream = new MemoryStream();

        using (fileStreamDeviceData)
        {
            var outputReportBuffer = new Byte[BufferSize];
            int offset = 0;
            int byteRead;

            while ((byteRead = await fileStreamDeviceData.ReadAsync(outputReportBuffer, offset, outputReportBuffer.Length)) != 0)
            {
                memoryStream.Write(outputReportBuffer, offset, byteRead);
                offset += BufferSize;
            }

            return memoryStream.ToArray();
        }
    }