Tôi đã viết ứng dụng giao diện điều khiển .net 4.0 định kỳ nói chuyện với modem GSM để nhận danh sách các tin nhắn SMS đã nhận (đó là modem USB nhưng mã kết nối với nó qua cổng nối tiếp) trình điều khiển và gửi lệnh AT - tình cờ nó là một modem Sierra Wireless nhưng tôi không thể thay đổi nó và tôi có trình điều khiển mới nhất). Điều gì xảy ra là sau một khoảng thời gian (có thể là hàng giờ, có thể ngày) nó chỉ dừng hoạt động. Dưới đây là một đoạn ghi ...Lớp SerialPort thỉnh thoảng treo trên 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'
Đó là kết thúc của các bản ghi - không có gì nhiều hơn mặc dù tôi sẽ mong đợi để xem thêm ít nhất một tuyên bố, đây là mã có liên quan:
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;
}
Như bạn có thể thấy nó bị treo trên phương thức Vứt bỏ của lớp SerialPort.
Tôi đã làm một số Googling và tôi đã gặp phải vấn đề này: Serial Port Close Hangs the application từ chủ đề này: serial port hangs whilst closing. Các consensious có vẻ là để đóng cổng trong một chủ đề khác nhau nhưng là chỉ cho một ứng dụng hình thức? Trong trường hợp của tôi, tôi có một ứng dụng giao diện điều khiển đơn giản vì vậy tôi không nghĩ rằng nó áp dụng (nó chỉ chạy trong một vòng lặp trong chủ đề chính). Tôi thậm chí không chắc chắn nó thực sự là vấn đề này (cảm giác của tôi là nó có nhiều khả năng rằng có một vấn đề với trình điều khiển cổng nối tiếp từ modem nhưng tôi không biết và có lẽ tôi đang không công bằng với modem). Theo như tôi nhìn thấy nó tôi có ba lựa chọn:
- Đóng cảng trong một thread khác
- Đặt trong một sự chậm trễ trước khi chốt cổng
- Rời khỏi cổng mở mãi mãi
tôi không thực sự thích bất kỳ giải pháp nào nhưng tôi đang nghĩ đến việc mở cổng và chỉ nhìn thấy những gì xảy ra (tôi có cảm giác rằng nó sẽ rò rỉ bộ nhớ hoặc tệ hơn, phơi bày một số vấn đề khác với modem nhưng có lẽ tôi chỉ bi quan và nếu đó là trường hợp tôi có thể có thể lấy đi với đóng nó mỗi 24 giờ, s ay, và mở lại nó một lần nữa) vì vậy câu hỏi của tôi là ...
Có vấn đề gì khác với mã này có thể gây ra sự bevahior này hoặc có cách giải quyết thay thế cho những gì tôi đã nêu ở trên không?
gì đang xảy ra bên trong _command.Execute (..)? – PeskyGnat
Bạn đã thử sử dụng giải pháp thay thế được đề xuất chưa? Tôi hiểu tất cả các ví dụ là Winforms, nhưng [bài viết mẹo] (http://blogs.msdn.com/b/bclteam/archive/2006/10/10/top-5-serialport-tips-_5b00_kim-hamilton_5d00_. aspx) mô tả vấn đề rất rõ ràng. Nó sẽ có giá trị ít nhất là cho nó một shot. –
Nó chỉ là gửi lệnh và nhận được một phản hồi trở lại (trong trường hợp này nó được gửi AT + CPMS = "ME") - nó đi ra khỏi cuộc gọi tốt mặc dù như tôi đã nhận "Xử lý SerialPort cho" thông điệp tường trình vì vậy tôi figured nó không quá liên quan đến những gì nó thực sự đã làm trong đó? Có điều gì mà tôi có thể làm mà có thể dẫn đến việc bị treo không? – kmp