- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我编写了一个 .net 4.0 控制台应用程序,它定期与 GSM 调制解调器对话以获取收到的 SMS 消息的列表(它是一个 USB 调制解调器,但代码通过串行端口驱动程序连接到它并发送 AT 命令 -顺便说一句,它是 Sierra Wireless 调制解调器,但我无法更改它,而且我有最新的驱动程序)。发生的事情是在一段时间后(可能是几小时,也许是几天)它就停止工作了。这是一个日志片段...
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 小时关闭一次,然后重新打开它)所以我的问题是......
此代码是否存在可能导致此行为的替代问题,或者是否存在我上面概述的替代解决方法?
最佳答案
SerialPort 有点容易死锁。到目前为止,最常见的原因是您发现的原因,它是通过在 DataReceived 事件处理程序中使用 Invoke() 触发的。这里显然不是你的情况。
这些死锁与 SerialPort 在幕后启动的工作线程有关。该线程有助于检测端口上的异步事件,底层 native winapi 是 WaitCommEvent()。该工作人员使 DataReceived、PinChanged 和 ErrorReceived 事件起作用。请注意您如何使用 ErrorReceived。
Dispose() 方法与 Close() 方法做同样的事情,它向工作线程发出退出信号。然而,缺陷是它不等待线程退出。这是一个麻烦的秘诀,在备注部分的 MSDN 文章中明确记录了 SerialPort.Close() 的那种:
The best practice for any application is to wait for some amount of time after calling the Close method before attempting to call the Open method, as the port may not be closed instantly.
坦率地说,这是“最佳实践”建议中最糟糕的做法,因为它根本没有具体说明您应该等待多长时间。有充分的理由,没有保证的安全值(value)。等待一两秒钟应该是 99.9% 的好。 0.1% 故障模式发生在机器负载很重并且工作线程根本没有足够的周期来及时检测关闭条件时。当然是完全不可调试的。
解决这个问题,只在程序开始时打开串行端口并在退出时关闭它。除了线程问题之外,这还可以确保您不会在另一个程序跳入并从您那里窃取端口时随机失去对该端口的访问权。请注意,实际上不再需要关闭端口,如果您不需要,Windows 会自行处理。
关于c# - SerialPort 类偶尔卡在 Dispose 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10209090/
我有 4 个 TextView。它们一开始都是不可见的,我将它们动画到屏幕上(从底部滑入)。我启动一个线程来为每个动画制作动画,每个动画开始时间间隔 200 毫秒。问题是:开始 Activity 后第
我有一个奇怪的问题,我似乎无法解决。 :(我有一个基于 Web 的应用程序,可以发送电子邮件。它通过连接在本地网络上设置的基于 Windows 的 SMTP 服务器来实现。此 SMTP 服务器不需要我
从昨天开始,我一直遇到一些设备收不到推送通知的问题。证书/设备 token 似乎是正确的,因为直到昨天,该设备还可以成功接收推送通知。 在服务器端,没有错误或连接拒绝,而且推送通知似乎每次都发送成功。
我有一个将 Angular 错误记录到数据库的应用程序,并且我偶尔会看到此错误的日志 Error: [$compile:tpload] http://errors.angularjs.org/1.5.
我收到一个 ImportError from azure.storage.blob import BlobServiceClient 但是我意识到当我安装依赖项时会发生错误 pip install a
我已经完成了使用AVAudioPlayer实现的简单音频播放GUI。 播放声音时,我使用UISlider提供播放反馈... 这是奇怪的地方。 我有一个非常偶尔发生的问题-而且大多数情况都不会发生,因此
在我的 XNA 游戏中,我的计算机(2.5 Ghz 双核 Intel Centrino 2)在 Debug模式下有一个大约需要 10 毫秒的操作。它只会每隔几分钟运行一次,它基本上只是整数数学/按位运
我相信我的应用程序编码正确(至少大部分是这样),因为它在大约 98% 的时间里都能正常工作。但是,大约 2% 的时间,我得到的似乎是有效的身份验证 token ,但是当我去发布照片时,我收到以下错误“
我在 apple store 上有一个应用程序,在 iOS6 更新后,我在 MKMapView 中收到了数百份崩溃报告。我无法在我的设备上重现崩溃。它看起来像是 EAGLContext 的问题。我们不
我最近开始使用 Foundation 5(我第一次使用 Foundation),我遇到了一个问题,似乎任何元素都响应了 .click 事件(例如顶部导航栏,单击元素时显示的数据下拉列表)将随机不起作用
花了大约一整天的时间试图解决这个问题,希望有人能帮助我!我是新来的,所以如果这是一个重复的问题,我深表歉意(我做了我的研究,但无法提前找到任何东西)。 我正在为我的咨询公司构建的网站使用浏览器缓存,但
我有一个表格,使用了以下 CSS 和 HTML: .price { position:relative; display:block; text-align:center; }
我们使用 ansible 将多个节点配置为一个集群。这些机器是在自定义 AWS 类似基础设施上创建的实例。 我们在不同的剧本上有大约一百个任务,它们在每个节点上执行。 问题是,我们收到零星的主机无法访
我们偶尔会从用户那里收到崩溃报告(我们使用崩溃报告程序包将崩溃发送到我们的服务器),并出现以下错误: “非法尝试在不同上下文中的对象之间建立关系‘...’” (不同的报表可能有不同的关系,并非所有报表
我是一名优秀的程序员,十分优秀!