SerialDevice:DataReader的DetachBuffer - 文档

时间:2017-02-27 04:03:26

标签: c# uwp

DataReader DetachBufferDetachStream的{​​{3}}非常模糊。它只是说`分离以前连接到阅读器的缓冲区'。

简而言之

什么时候应该使用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;
    }
}

如果连接的设备停止响应,此代码会在启动几分钟内或几秒钟内崩溃我的应用程序(有时会出现“访问冲突”消息)。

我添加reader.DetachBuffer();之后代码再次稳定,但我仍然不知道是否应该始终调用DetachBuffer,有时或根本不调用writer.DetachStream()

编写

我的写方法不会调用using (var writer = new DataWriter(outputStream)) { writer.WriteBytes(toSend); var bytesWritten = await writer.StoreAsync(); //Should writer.DetachBuffer(); be called? writer.DetachStream(); return bytesWritten; } ,但我不知道它是否应该。代码是:

aside.sidebar-primary

0 个答案:

没有答案