首页 > 解决方案 > 尝试从 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);
    }
}

标签: c#uwp.net-core

解决方案


我想我明白了。

除了有一个读取线程之外,我还在使用DataWriter. 但是我的 write 方法会DataWriter在每次写入时处理掉。相反,我现在将它声明为我的串行类的私有成员,并且我实例化了DataWriteron 连接并在我的 close 方法中处理它。

这似乎使交流继续进行。

不知道为什么会发生这种情况,欢迎任何解释。


推荐阅读