2017-03-24 30 views
0

私のC#WinFormsアプリケーションは、シリアルポートから非同期に読み込みます。それは動作しますが、ポートが閉じるとStackOverflowExceptionが表示されます。呼び出しスタックは、ReadAsyncの末尾に行await ReadAsync(serialPort)でオーバーフローしています。 SeriaPortを閉じてもkeepReadingフラグをチェックしてserialPort.IsOpenをチェックしても、ReadAsyncはまだ実行されています。
それでは、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

答えて

0

は別の非同期メソッドにserialPort.BaseStream.ReadAsync(buffer, 0, 1);をラップして、シリアルポートを閉じる前に、このメソッドをキャンセルするタスクのキャンセルを使用するようにしてください。 Cancel an Async Task or a List of Tasks (C#)

関連する問題