C# 串行设备:DataReader';s缓冲区-文档

C# 串行设备:DataReader';s缓冲区-文档,c#,uwp,C#,Uwp,DataReader的DetachBuffer和DetachStream的定义非常模糊。它只是说“分离以前连接到读卡器的缓冲区” 简言之 什么时候应该reader.DetachBuffer()可以使用吗 背景 阅读 SerialDevice的示例读取方法如下所示: using (var reader = new DataReader(inputStream)) { var bytesReceived = await reader.LoadAsync(EXPECTED_RESPONSE_L

DataReader的
DetachBuffer
DetachStream
的定义非常模糊。它只是说“分离以前连接到读卡器的缓冲区”

简言之

什么时候应该
reader.DetachBuffer()可以使用吗

背景

阅读

SerialDevice
的示例读取方法如下所示:

using (var reader = new DataReader(inputStream))
{
    var bytesReceived = await reader.LoadAsync(EXPECTED_RESPONSE_LENGTH);

    var receivedBuffer = new byte[bytesReceived];
    reader.ReadBytes(receivedBuffer);

    reader.DetachStream();
    return receivedBuffer;
}   
这段代码工作正常,看起来很稳定,但由于我在嵌入式设备上每秒写入和读取多次,我希望避免每次都创建
receivedBuffer
缓冲区。我修改了我的方法,使之类似于下面的代码

byte[] _receivedBuffer = new byte[EXPECTED_RESPONSE_LENGTH];

private async Task<byte[]> ReadOnceAsync(IInputStream inputStream)
{
    using (var reader = new DataReader(inputStream))
    {
        reader.InputStreamOptions = InputStreamOptions.Partial;

        uint bytesReceived = await reader.LoadAsync(EXPECTED_RESPONSE_LENGTH);

        var isExpectedLength = (bytesReceived == EXPECTED_RESPONSE_LENGTH);
        if (isExpectedLength)
        {
            reader.ReadBytes(_receivedBuffer);
        }

        reader.DetachStream();
        return isExpectedLength ? _receivedBuffer: null;
    }
}

要知道还有多少内容需要阅读,我建议您使用
DataReader.unsumedbufferlength
属性。该using语句的作用与您认为的不同。DataReader没有任何值得丢弃或关闭的东西。它实际上是调用inputStream.Close()。在那之后你就不能再使用它了,你可能会这样做。通过调用分离方法,可以限制损坏。明智的做法是,只要SerialDevice在使用中,就不要使用或保持DataReader对象。@HansPassant我知道你是一位大师,但你对这方面的了解是基于什么?你能分享一个可以重现你的问题的方法吗?当我使用您的代码进行测试时,它在我这边运行良好。总之,应该不需要使用
reader.DetachBuffer()
在代码中。要知道还有多少内容需要阅读,我建议您使用
DataReader.UnsumedBufferLength
属性。该using语句的作用与您认为的不同。DataReader没有任何值得丢弃或关闭的东西。它实际上是调用inputStream.Close()。在那之后你就不能再使用它了,你可能会这样做。通过调用分离方法,可以限制损坏。明智的做法是,只要SerialDevice在使用中,就不要使用或保持DataReader对象。@HansPassant我知道你是一位大师,但你对这方面的了解是基于什么?你能分享一个可以重现你的问题的方法吗?当我使用您的代码进行测试时,它在我这边运行良好。总之,应该不需要使用
reader.DetachBuffer()在您的代码中。
using (var writer = new DataWriter(outputStream))
{
    writer.WriteBytes(toSend);
    var bytesWritten = await writer.StoreAsync();
    //Should writer.DetachBuffer(); be called?
    writer.DetachStream();
    return bytesWritten;
}