2017-03-24 3 views
0

내 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); 
      } 
     } 
    } 
+0

오류는 언제 발생합니까? 항구를 닫은 직후에? 나는 테스트를했기 때문에 예외를주지 않았다. 오랜 기간 일을해도 실패 할 수 있습니까? – taquion

+2

StackOverflowException은 응용 프로그램이 잠시 동안 작동 한 후에 throw 될 수 있으며 ReadAsync에 대한 재귀 호출로 인해 발생할 수 있다고 생각합니다. 결국 앱이 포트를 통해 정보를 수신 할 때마다 새로운 호출이 스택에 저장되고 첫 번째 호출이 끝나지 않으므로 잠시 후에 많은 정보가 수신되는 경우 ReadAsync에 대한 호출이 많아 질 수 있습니다. stackoverflowexception throw됩니다 – taquion

+0

@taquion 예, 짧은 간격으로 오류가 발생하지 않습니다. 재귀 호출을 대체하는 방법? – ronaldo90210

답변