我已經寫了一個.net 4.0控制檯應用程序,它週期性地與GSM調制解調器通信,以獲取接收到的SMS消息列表(它是USB調制解調器,但代碼通過串行端口連接到它驅動程序併發送AT命令 - 順便說一下,它是一個Sierra無線調制解調器,但我無法更改它,並且我擁有最新的驅動程序)。會發生什麼是在一段時間(可能是幾小時,也許幾天)之後,它會停止工作。下面是一個日誌片斷......SerialPort類偶爾掛起處置
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'
這是日誌的末尾 - 僅此而已儘管我希望看到至少多了一個聲明,這裏是有關的代碼:
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。這種共識似乎是在一個不同的線程中關閉這個端口,但這只是一個表單應用程序?在我的情況下,我有一個簡單的控制檯應用程序,所以我不認爲它適用(它只是在主線程中循環運行)。我甚至不確定這是否是這個問題(我的感覺是,更可能是調制解調器的串口驅動程序存在問題,但我不知道,也許我對調制解調器不公平)。據我看到它,我有三種選擇:
- 關閉在不同的線程
- 在延遲把端口關閉端口
- 前離開端口打開永遠
我並不是真的喜歡這些解決辦法中的任何一種,但我正在考慮將端口打開並只看到會發生什麼(我有這種感覺會泄漏內存或更糟,揭露調制解調器的其他問題,但也許我只是悲觀並且如果是這種情況,我可能會每24小時關閉一次,s唉,並重新打開它)所以我的問題是...
是否有這個代碼可能會導致這個bevahior或有替代解決方法的替代問題,我已經概述上面?
這是怎麼回事裏面_command.Execute(..)? – PeskyGnat 2012-04-18 12:19:45
您是否嘗試使用建議的解決方法?我明白所有的例子都是Winforms,但[提示文章](http://blogs.msdn.com/b/bclteam/archive/2006/10/10/top-5-serialport-tips-_5b00_kim-hamilton_5d00_。 aspx)非常清楚地描述了這個問題。這至少值得一試。 – 2012-04-18 12:23:14
它只是發送命令並獲取響應(在這種情況下,它發送AT + CPMS =「我」) - 它出來的罰款,雖然因爲我得到了「丟棄串口」日誌消息,所以我想它在那裏實際上做了什麼並不太相關?有沒有我能做的事情會導致死機? – kmp 2012-04-18 12:23:16