c# - 尝试从 SerialDevice ReadAsync 静默地使应用程序崩溃
问题描述
我有一个从串行端口连续读取的任务。我看不出有任何外部原因表明这不起作用,但我并不认为我可能会遗漏一些明显的东西。
if (serialPort != null)
{
while (true)
{
Windows.Storage.Streams.Buffer inputBuffer = new Windows.Storage.Streams.Buffer(1024);
Windows.Storage.Streams.Buffer resultBuffer = new Windows.Storage.Streams.Buffer(1024);
using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(ReadCancellationTokenSource.Token))
{
var t = serialPort.InputStream.ReadAsync(inputBuffer, inputBuffer.Capacity, InputStreamOptions.Partial).AsTask(ReadCancellationTokenSource.Token);
resultBuffer = (Windows.Storage.Streams.Buffer)await t;
if (resultBuffer.Length > 0)
{
LogDebug(string.Format("Read {0} bytes", resultBuffer.Length));
DataReader dataReader = Windows.Storage.Streams.DataReader.FromBuffer(resultBuffer);
string resultString = dataReader.ReadString(resultBuffer.Length);
OnDataReceived(new DataReceiptEventArgs { Data = resultString });
}
}
await Task.Delay(10);
}
}
这样做的结果是它在第一次迭代时正确读取,但ReadAsync
在下一次迭代发生并且所有数据都已被读取时,似乎并没有优雅地处理流上的任何数据。我希望行为是该任务在数据可用之前不会返回。至少,我会期待一个异常,所以我可能会发现读取失败。
相反,调试器会记录一条消息,指出我的应用程序“已退出,代码为 -1073741811 (0xc000000d)。” 这是STATUS_INVALID_PARAMETER
。
我究竟做错了什么?或者这真的永远不会奏效吗?
编辑:
此代码产生相同的错误:
if (serialPort != null)
{
dataReaderObject = new DataReader(serialPort.InputStream);
LogDebug("Listening...");
while (true)
{
uint ReadBufferLength = 1024;
ReadCancellationTokenSource.Token.ThrowIfCancellationRequested();
dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;
using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(ReadCancellationTokenSource.Token))
{
UInt32 bytesRead = 0;
bytesRead = await dataReaderObject.LoadAsync(ReadBufferLength).AsTask(childCancellationTokenSource.Token);
if (bytesRead > 0)
{
LogDebug(string.Format("Read {0} bytes", bytesRead));
string resultString = dataReaderObject.ReadString(bytesRead);
OnDataReceived(new DataReceiptEventArgs { Data = resultString });
}
}
await Task.Delay(10);
}
}
解决方案
我想我明白了。
除了有一个读取线程之外,我还在使用DataWriter
. 但是我的 write 方法会DataWriter
在每次写入时处理掉。相反,我现在将它声明为我的串行类的私有成员,并且我实例化了DataWriter
on 连接并在我的 close 方法中处理它。
这似乎使交流继续进行。
不知道为什么会发生这种情况,欢迎任何解释。
推荐阅读
- bootstrap-4 - bootstrap 如何知道屏幕尺寸是多少?
- kubernetes - Azure Functions 支持使用在 Kubernetes 中运行的 HTTP 触发器进行身份验证
- authentication - Okta 在登录特定操作后重新输入密码
- javascript - HTML属性值通过javascript更改后返回其初始值
- github - 如何获取 Github 提交的链接?
- python - barh matplotlib(python)中的条形高度
- python - 列表迭代值(int)与 Pandas 单元格值不匹配,但应该吗?
- python - 在随机 networkx 图中设置不同的节点颜色
- python - 动态更改任务重试次数
- windows - Windows 上的 Rshell 在通过 rsync 或 cp 将文件发送到运行 micropython 的 ESP32 时随机冻结