C# 尝试从SerialDevice以静默方式从应用程序读取异步

C# 尝试从SerialDevice以静默方式从应用程序读取异步,c#,uwp,.net-core,C#,Uwp,.net Core,我有一个任务正在从串行端口连续读取数据。我看不出任何外在的原因,这是行不通的,但我不认为我可能遗漏了一些明显的东西 if(serialPort!=null) { while(true) { Windows.Storage.Streams.Buffer inputBuffer=新的Windows.Storage.Streams.Buffer(1024); Windows.Storage.Streams.Buffer resultBuffer=新的Windows.Storage.Streams.Bu

我有一个任务正在从串行端口连续读取数据。我看不出任何外在的原因,这是行不通的,但我不认为我可能遗漏了一些明显的东西

if(serialPort!=null)
{
while(true)
{
Windows.Storage.Streams.Buffer inputBuffer=新的Windows.Storage.Streams.Buffer(1024);
Windows.Storage.Streams.Buffer resultBuffer=新的Windows.Storage.Streams.Buffer(1024);
使用(var childCancellationTokenSource=CancellationTokenSource.CreateLinkedTokenSource(ReadCancellationTokenSource.Token))
{
var t=serialPort.InputStream.ReadAsync(inputBuffer,inputBuffer.Capacity,InputStreamOptions.Partial).AsTask(ReadCancellationTokenSource.Token);
resultBuffer=(Windows.Storage.Streams.Buffer)等待t;
如果(resultBuffer.Length>0)
{
LogDebug(string.Format(“读取{0}字节”,resultBuffer.Length));
DataReader DataReader=Windows.Storage.Streams.DataReader.FromBuffer(resultBuffer);
string resultString=dataReader.ReadString(resultBuffer.Length);
OnDataReceived(新DataReceiptEventArgs{Data=resultString});
}
}
等待任务。延迟(10);
}
}
这样做的结果是,它在第一次迭代时读取正确,但在下一次迭代发生且所有数据都已读取时,
ReadAsync
似乎无法正常处理流中的任何数据。我希望行为是直到数据可用时任务才返回。至少,我希望出现一个异常,这样我就可以发现读取失败了

相反,调试器会记录一条消息,表明我的应用程序“已退出,代码为-1073741811(0xc000000d)”,这是
状态\u无效\u参数

我做错了什么?或者这真的永远不会奏效

编辑: 此代码产生相同的错误:

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
,并在close方法中处理它

这似乎可以保持沟通

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