我有一个从串口连续读取的任务。我没有看到任何外在的原因,这不会起作用,但我不打算说我可能会遗漏一些明显的东西。
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);
}
}
答案 0 :(得分:0)
我想我已经明白了。
除了读取线程之外,我还使用DataWriter
编写。但是我的写方法会在每次写入时处理DataWriter
。相反,我现在将其声明为我的序列类的私有成员,并在连接时实例化DataWriter
并在我的close方法中处理它。
这似乎可以保持沟通。
不知道为什么会发生这种情况,欢迎任何解释。