0
我的c#WinForms应用程序是从串口异步读取的。它可以工作,但是当端口关闭时,出现StackOverflowException
。调用堆栈在ReadAsync
的末尾与行await ReadAsync(serialPort)
溢出。我的猜测是该线等待ReadAsync仍然运行,即使我关闭SeriaPort,keepReading
标志并检查serialPort.IsOpen
。
因此,如何取消等待ReadAsync的问题,这有可能吗?在这里感谢一些帮助,因为我是初学者。如何取消等待SerialPort.BaseStream.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);
}
}
}
何时发生故障?在关闭端口后立即停止?因为我已经做了一个测试,它没有给我例外。经过长时间的工作后可能会失败吗? – taquion
我认为在应用程序工作了一段时间之后可能会抛出StackOverflowException,这是由于对ReadAsync的递归调用。毕竟,每次应用程序通过端口收到信息时,都会将新呼叫放入堆栈,并且第一个呼叫不会结束,因此,如果您收到很多次信息,过了一会儿,您可能会收到很多对ReadAsync的呼叫, stackoverflowexception抛出 – taquion
@taquion是的,在很短的时间间隔内,错误不会发生。那么如何取代递归调用呢? – ronaldo90210