Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何取消等待SerialPort.BaseStream.ReadAsync?_C#_.net_Asynchronous_Serial Port_Task - Fatal编程技术网

C# 如何取消等待SerialPort.BaseStream.ReadAsync?

C# 如何取消等待SerialPort.BaseStream.ReadAsync?,c#,.net,asynchronous,serial-port,task,C#,.net,Asynchronous,Serial Port,Task,我的c#WinForms应用程序从串行端口异步读取。它可以工作,但当端口关闭时,会出现StackOverflowException。调用堆栈在ReadAsync的末尾溢出了行await ReadAsync(serialPort)。我的猜测是,即使我关闭SeriaPort,keepReading标志并检查serialPort.IsOpen,等待ReadAsync的行仍会运行因此,问题是,如何取消等待ReadAsync,是否可能?谢谢你的帮助,因为我是初学者 public async Task Re

我的c#WinForms应用程序从串行端口异步读取。它可以工作,但当端口关闭时,会出现
StackOverflowException
。调用堆栈在
ReadAsync
的末尾溢出了行
await ReadAsync(serialPort)
。我的猜测是,即使我关闭SeriaPort,
keepReading
标志并检查
serialPort.IsOpen
,等待ReadAsync的行仍会运行
因此,问题是,如何取消等待ReadAsync,是否可能?谢谢你的帮助,因为我是初学者

public async Task ReadAsync(SerialPort serialPort)
    {

            if (serialPort.IsOpen && keepReading)
            {
                try
                {
                        byte[] buffer = new byte[1];
                        await serialPort.BaseStream.ReadAsync(buffer, 0, 1);
                        content += serialPort.Encoding.GetString(buffer);
                        //do sth with content
                        buffer = null;

                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message);
                }
                if (keepReading && serialPort.IsOpen)
                    await ReadAsync(serialPort);
            }
    }
private async void Button_Click(object sender, EventArgs e)
    {

        if (serialPort.IsOpen)
        {
            keepReading = false;
            serialPort.Dispose();
            serialPort.Close();
        }
        else
        {
            Open();
            keepReading = true;
            if (serialPort.IsOpen)
            {
                serialPort.DiscardOutBuffer();
                serialPort.DiscardInBuffer();
                await ReadAsync(serialPort);
            }
        }
    }

尝试包装
serialPort.BaseStream.ReadAsync(缓冲区,0,1)编码到另一个异步方法中,并在关闭串行端口之前使用任务取消来取消此方法。

故障何时发生?在关闭港口后立即?因为我做了一个测试,它没有给我例外。可能是在长时间工作后失败了吗?我认为在应用程序运行一段时间后可能会抛出StackOverflowException,这是由于对ReadAsync的递归调用。毕竟,每次应用程序通过端口接收信息时,都会在堆栈中放入一个新的调用,并且第一个调用不会结束,因此,如果您多次收到信息,那么一段时间后,您可能会收到大量对ReadAsync的调用,从而导致stackoverflowexception异常thrown@taquion是的,在短时间间隔内,错误不会发生。那么,如何替换递归调用呢?