私の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);
}
}
}
エラーはいつ発生しますか?ポートを閉鎖した直後ですか?私はテストをしたので、それは私に例外を与えません。それは仕事の長い期間の後に失敗することがありますか? – taquion
私はStackOverflowExceptionがアプリケーションがしばらくの間働いていて、これがReadAsyncへの再帰呼び出しのためにスローされると思う。結局のところ、アプリケーションがポート経由で情報を受け取るたびに、新しい呼び出しがスタックに入れられ、最初の呼び出しが終了しないので、しばらくすると何度も何度も情報を受け取ると、多くの情報がReadAsync stackoverflowexceptionがスローされました – taquion
@taquionはい、短い間隔で、エラーは発生しません。どのように再帰呼び出しを置き換えるには? – ronaldo90210