【问题标题】:UWP Unhandled Exception when writing to serial写入串行时 UWP 未处理的异常
【发布时间】:2018-01-27 20:40:15
【问题描述】:

我在写入 UWP 中的串行设备时遇到问题。我写入端口的任务如下所示:

    public async Task WriteAsync(byte[] stream)
    {
        if (stream.Length > 0 && serialDevice != null)
        {
            await writeSemaphore.WaitAsync();
            try
            {
                DataWriter dataWriter = new DataWriter(serialDevice.OutputStream);

                dataWriter.WriteBytes(stream);

                await dataWriter.StoreAsync();
                dataWriter.DetachStream();
                dataWriter = null;                    
            }
            finally
            {
                writeSemaphore.Release();
            }

        }
    }

代码在我调用这个函数的前两次运行良好。我第三次在 await dataWriter.StoreAsync() 行中的 ntdll.dll 中得到未处理的异常。

我能看到的完整例外是:

xx.exe 中 0x00007FFCB3FCB2C0 (ntdll.dll) 处未处理的异常: 0xC000000D:向服务或函数传递了无效参数。

This answer 提到垃圾收集器关闭输入流,但是我不明白为什么它会在我的代码中发生。任何帮助了解此问题的底部都将受到高度赞赏!

【问题讨论】:

  • 这是什么语言?这被标记为“C”。
  • 它是 C#。刚刚修好了!

标签: c# uwp serial-port windows-10 ntdll


【解决方案1】:

原来我的问题的解决方案是在另一段代码中。我有一个函数读取这样的字节:

        private async Task ReadAsync(CancellationToken cancellationToken)
    {
        Task<UInt32> loadAsyncTask;

        uint ReadBufferLength = 1024;

        // If task cancellation was requested, comply
        cancellationToken.ThrowIfCancellationRequested();

        // Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available
        dataReader.InputStreamOptions = InputStreamOptions.Partial;

        using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
        {
            // Create a task object to wait for data on the serialPort.InputStream
            loadAsyncTask = dataReader.LoadAsync(ReadBufferLength).AsTask(childCancellationTokenSource.Token);

            // Launch the task and wait
            UInt32 bytesRead = await loadAsyncTask;
            if (bytesRead > 0)
            {
                byte[] vals = new byte[3]; //TODO:adjust size
                dataReader.ReadBytes(vals);
                //status.Text = "bytes read successfully!";
            }
        }
    }

具体问题出在以下两行:

byte[] vals = new byte[3]; //TODO:adjust size
dataReader.ReadBytes(vals);

一旦我将 vals 数组的大小设置为 bytesRead 值,问题就消失了。

【讨论】:

    【解决方案2】:

    通常,您不必将 dataWriter 设置为 null,因为 GC 会知道不再使用某个对象。

    您最好像许多 UWP 示例一样调用 dataWriter.Dispose() 方法。

    例如:SocketActivityStreamSocket

    请阅读IDisposable.Dispose Method ()文档了解更多详情。

    【讨论】:

    • 感谢您的建议,在我将 dataWriter 包装在 using 语句之前,但问题仍然存在。最后,我想我设法解决了这个问题,尽管它不是我最初寻找的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多