2017-03-24 53 views
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); 
      } 
     } 
    } 
+0

何时发生故障?在关闭端口后立即停止?因为我已经做了一个测试,它没有给我例外。经过长时间的工作后可能会失败吗? – taquion

+2

我认为在应用程序工作了一段时间之后可能会抛出StackOverflowException,这是由于对ReadAsync的递归调用。毕竟,每次应用程序通过端口收到信息时,都会将新呼叫放入堆栈,并且第一个呼叫不会结束,因此,如果您收到很多次信息,过了一会儿,您可能会收到很多对ReadAsync的呼叫, stackoverflowexception抛出 – taquion

+0

@taquion是的,在很短的时间间隔内,错误不会发生。那么如何取代递归调用呢? – ronaldo90210

回答