DataReader DetachBuffer
和DetachStream
的{{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