내 C# WinForms 응용 프로그램이 직렬 포트에서 비동기 적으로 읽는 중입니다. 작동하지만 포트가 닫히면 StackOverflowException
이 나타납니다. 호출 스택은 ReadAsync
끝에 await ReadAsync(serialPort)
줄 넘침. 내 생각에 SeriaPort, keepReading
플래그를 닫고 serialPort.IsOpen
을 확인하더라도 ReadAsync가 계속 실행될 것으로 예상됩니다.
따라서 ReadAsync를 기다리고있는 중대한 문제는 어떻게 해결할 수 있습니까? 내가 초보이기 때문에 여기에 도움을 주셔서 감사합니다. 다른 비동기 방식으로 serialPort.BaseStream.ReadAsync(buffer, 0, 1);
포장 및 직렬 포트를 닫기 전에이 방법을 취소하려면 작업 취소를 사용하는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은 응용 프로그램이 잠시 동안 작동 한 후에 throw 될 수 있으며 ReadAsync에 대한 재귀 호출로 인해 발생할 수 있다고 생각합니다. 결국 앱이 포트를 통해 정보를 수신 할 때마다 새로운 호출이 스택에 저장되고 첫 번째 호출이 끝나지 않으므로 잠시 후에 많은 정보가 수신되는 경우 ReadAsync에 대한 호출이 많아 질 수 있습니다. stackoverflowexception throw됩니다 – taquion
@taquion 예, 짧은 간격으로 오류가 발생하지 않습니다. 재귀 호출을 대체하는 방법? – ronaldo90210