RS232を介してモーターを制御するC#で.NET4.0WPFアプリケーションを開発しています。アプリケーションを終了するときに、comportを閉じるときにアプリケーションがデッドロックすることがあるという問題があります。
インターネットで調べたところ、これは一般的な問題であり、DataReceivedEventでBeginInvokeを使用するか、別のスレッドでシリアルポートを閉じると問題が解決するはずです。これらの回避策の問題はそれです。1.DataReceiveEventを使用しません。2.別のスレッドでシリアルポートを閉じても違いはありません。何が起こるかというと、GUIがシャットダウンしますが、タスクマネージャーでプロセスがまだ実行中であることがわかります。
私が試した他のことは:
- シリアルポートを閉じず、アプリケーションを終了するだけです。これにより、アプリケーションとプロセスは正常に閉じられますが、シリアルポートはまだブロックされています。シリアルポートのブロックを解除するには、コンピューターを再起動する必要があります。
- シリアルポートを閉じる前後に数秒寝ています。
- アプリケーションをWinFormsアプリにする。WPFの代わりに。2つの間のデッドロックに違いはありません。
私がプログラムを実行するコンピューターは、マザーボードにマウントされ、Microsoftドライバーを備えたcomポートを使用しています。
そして今、いくつかのコードについて:
Window_Closingイベントは次のようになります。
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
window.Closing -= Window_Closing;
Thread CloseDown = new Thread(new ThreadStart(server.Dispose)); //Closes serialport everything in another thread to avoid hang on serialport close.
CloseDown.Start();
}
server
シリアルポートを管理するオブジェクトはどこにありますか。そしてDispose
、シリアルポートクローズ関数を呼び出します。
シリアルポートクローズ機能:
public void Close()
{
DebugLog.Write(3, "-->MacCommSerialPort.Close");
_com.Close();
DebugLog.Write(3, "<--MacCommSerialPort.Close");
}
シリアルポート設定:
_com = new SerialPort(portNumber);
_com.BaudRate = 19200;
_com.Parity = Parity.None;
_com.DataBits = 8;
_com.Encoding = Encoding.GetEncoding("Windows-1252");
_com.StopBits = StopBits.One;
_com.RtsEnable = false;
_com.DtrEnable = false;
_com.WriteTimeout = 400;
_com.ReadTimeout = 1000;