C# 串行设备:DataReader';s缓冲区-文档
DataReader的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
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;
}