私は、受信したSMSメッセージのリストを得るためにGSMモデムと定期的に通信する.net 4.0コンソールアプリケーションを作成しました(これはUSBモデムですが、コードはシリアルポートドライバはATコマンドを送信します - それはSierraワイヤレスモデムですが、私はそれを変更することはできませんし、最新のドライバがあります)。何が起こるかは、ある時間の後(多分数時間、多分数日)、それはちょうど動作を停止します。ここでは、ログのスニペットは、ログの最後であること...SerialPortクラスが時折ハングアップするDispose
2012-04-17 23:07:31 DEBUG Modem Check (108) - Executing AT command 'AT+CPMS="ME"'...
2012-04-17 23:07:31 DEBUG Modem Check (108) - Finished executing 'AT+CPMS="ME"'
2012-04-17 23:07:31 DEBUG Modem Check (108) - Detaching event handlers for 'COM13'
2012-04-17 23:07:31 DEBUG Modem Check (108) - Disposing the SerialPort for 'COM13'
である - 私はここに、少なくとももう1つの文を見ることを期待するよりもかかわらず、何も関連するコードはありません:
internal T Execute()
{
var modemPort = new SerialPort();
T ret;
try
{
modemPort.ErrorReceived += ModemPortErrorReceived;
modemPort.PortName = _descriptor.PortName;
modemPort.Handshake = Handshake.None;
modemPort.DataBits = 8;
modemPort.StopBits = StopBits.One;
modemPort.Parity = Parity.None;
modemPort.ReadTimeout = ReadTimeout;
modemPort.WriteTimeout = WriteTimeout;
modemPort.NewLine = "\r\n";
modemPort.BaudRate = _descriptor.Baud;
if (!modemPort.IsOpen)
{
modemPort.Open();
}
ret = _command.Execute(modemPort, _logger);
_logger.Debug("Detaching event handlers for '{0}'",
_descriptor.PortName);
modemPort.ErrorReceived -= ModemPortErrorReceived;
_logger.Debug("Disposing the SerialPort for '{0}'",
_descriptor.PortName);
}
catch (IOException ex)
{
_logger.Error(ex.Message);
throw new CommandException(
string.Format(CultureInfo.CurrentCulture,
ModemWrapperStrings.COMMAND_ERROR,
ex.Message),
ex);
}
catch (UnauthorizedAccessException ex)
{
_logger.Error(ex.Message);
throw new CommandException(
string.Format(CultureInfo.CurrentCulture,
ModemWrapperStrings.COMMAND_ERROR,
ex.Message),
ex);
}
finally
{
modemPort.Dispose();
_logger.Debug("Modem on port '{0}' disposed",
_descriptor.PortName);
}
return ret;
}
ご覧のとおり、SerialPortクラスのDisposeメソッドでハングします。
私はいくつかのグーグルを行い、この問題に遭遇しました:Serial Port Close Hangs the applicationこのスレッドから:serial port hangs whilst closing。コンソーシアムは、別のスレッドでポートを閉じるように見えますが、フォームアプリケーションのためだけです。私の場合、単純なコンソールアプリケーションがあるので、それは当てはまるとは思わない(メインスレッドのループ内で実行されている)。私はそれが実際にこの問題であることさえ確信していません(私の気持ちは、モデムからシリアルポートドライバに問題がある可能性が高いですが、私は知らないし、おそらく私はモデムに対して不公平です)。
-
私は
- ポートを閉じる前に、遅延に入れて別のスレッド
- のポートが
永遠に開いているポートを残す
このコードには、このbevahiorの原因となっている可能性のある別の問題がありますか、上記で概説した回避策がありますか?
? – PeskyGnat
回避策を使用してみましたか?私はすべての例がWinformsだと理解していますが、[ヒント記事](http://blogs.msdn.com/b/bclteam/archive/2006/10/10/top-5-serialport-tips-_5b00_kim-hamilton_5d00_。 aspx)は問題を非常にはっきりと記述しています。それは少なくともそれを与える価値があるだろう。 –
これは単にコマンドを送信して応答を返すだけです(この場合はAT + CPMS = "ME"を送信しました)。これは、「Disposeing the SerialPort for」ログメッセージが表示されているので、実際にそこで何をしたのかはそれほど関連性がありませんでしたか?私がハングにつながることができる何かがありますか? – kmp