C# 如何取消等待SerialPort.BaseStream.ReadAsync?
我的c#WinForms应用程序从串行端口异步读取。它可以工作,但当端口关闭时,会出现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
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是的,在短时间间隔内,错误不会发生。那么,如何替换递归调用呢?