0

我在 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:向服务或函数传递了无效参数。

这个答案提到了一个关闭输入流的垃圾收集器,但是我不明白为什么它会在我的代码中发生。任何帮助了解此问题的底部将不胜感激!

4

2 回答 2

2

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

        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 值,问题就消失了。

于 2018-01-30T15:20:38.190 回答
1

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

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

例如:SocketActivityStreamSocket

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

于 2018-01-29T07:12:51.143 回答