c# SerialPort会出现“已关闭 Safe handle”的错误
c# SerialPort使用时出现“已关闭 Safe handle”的错误
我在开发SerialPort程序时出现了一个问题,在一段特殊的扫描代码的时候会出现“已关闭 Safe handle”的错误,很疑惑。我是通过线程对串口进行扫描的,原本我以为handle是指的线程,于是代码跟踪了半天,但也没发现线程有什么问题。于是把目光转移到SerialPort类上,写了一段测试代码:
using System;
using System.Threading;
using System.IO.Ports;
namespace ConsoleApplication1
{
class Program
{
static SerialPort com = new SerialPort("COM1", 19200, Parity.Space, 8, StopBits.One);
static void Main(string[] args)
{
com.Open();
Thread thread = new Thread(new ThreadStart(Run));
thread.IsBackground = true;
thread.Start();
Thread.Sleep(3000);
thread.Abort();
Console.WriteLine("Finished!");
Console.Read();
}
static void Run()
{
string s = com.ReadLine();
}
}
}
果然问题再现了,当thread.Abort()时出现了“已关闭 Safe handle”的错误,看来元凶就是SerialPort类了。其实这里不要勿以为是线程关闭出现了错误,而是线程里的 string s = com.ReadLine();
SerialPort.ReadLine()在没有读取到数据时是会挂起的,这里线程就被挂起了。理应挂起的线程也可以关闭,可是这里SerialPort有点特殊,仍然会读取串口,而此时开启的串口资源应该是被GC掉了,或者其他什么的,我没有细究下去,反正是无法访问到了。再用com.ReadLine(),当然要发生Handle关闭的情况,于是改写测试代码:
using System;
using System.Threading;
using System.IO.Ports;
namespace ConsoleApplication1
{
class Program
{
static SerialPort com = new SerialPort("COM1", 19200, Parity.Space, 8, StopBits.One);
static void Main(string[] args)
{
com.Open();
Thread thread = new Thread(new ThreadStart(Run));
thread.IsBackground = true;
thread.Start();
Thread.Sleep(3000);
com.Close();
thread.Abort();
Console.WriteLine("Finished!");
Console.Read();
}
static void Run()
{
string s = com.ReadLine();
}
}
}
加上一段串口关闭的指令,不再读取handle了,强行关闭(总觉得有点怪)。当然如果后面还要用到串口还得要打开一次,但是问题大体描述就是这样了。
其实这种方法不是最佳的解决途径,应该使用到SafeHandle,msdn描述的比较清楚。
c# SerialPort会出现“已关闭 Safe handle”的错误的更多相关文章
- 解决com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭
com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭. at com.microsoft.sqlserver.jdbc.SQLServerEx ...
- ASP.NET Aries 2.0 发布(原来的源码SVN已关闭,开源源码已迁移到GitHub)
主要更新: 1:增加子目录部署支持. 2:增加Taurus.MVC支持. 3:优化及Bug修复. 1:增加子目录部署支持: 其实在重写Aries框架的时候,我是去掉了目录部署功能的,主要是为了加快Ar ...
- [转载]使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
转载,原文来自 http://blog.csdn.net/hawksoft/article/details/21776009 最近调试原来的微信模拟登陆时发生了“基础连接已关闭,发送时发生错误”的错误 ...
- (微信API接口开发) 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
最近调试原来的微信模拟登陆时发生了“基础连接已关闭,发送时发生错误”的错误提示,原来都是好好的,只是很久没用了. 出错代码如下: HttpWebRequest req = (HttpWebReques ...
- Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流的解决方法
原本在CS项目中用的好好的在BS项目中既然提示我导出出现无法访问已关闭的流的解决方法 比较郁闷经过研究 终于解决了先将方法发出来 让遇到此问题的筒子们以作参考 //新建类 重写Npoi流方法 publ ...
- outlook2010怎么老提示IMAP服务器已关闭连接啊
最近在Outlook中使用 网易 163邮件的IMAP功能时,发现接收邮件的速度非常慢,才几封邮件就花了至少15分钟才停止了同步邮件服务器的过程,然后提示一个对话框:"IMAP 服务器已 ...
- 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
原文地址:http://blog.csdn.net/hawksoft/article/details/21776009 最近调试原来的微信模拟登陆时发生了“基础连接已关闭,发送时发生错误”的错误提示, ...
- 多线程下System.Security.Cryptography.Aes CreateDecryptor报“Safe handle has been closed”的解决方案
因为系统需要对一些核心数据进行预加载以保证查询速度. 所以在application_start 事件中启用了后台线程对相关的数据进行加载并解密(为了保证解密的效率,将AES对像做了静态对像来保存:pr ...
- DB2读取CLOB字段-was报错:操作无效:已关闭 Lob。 ERRORCODE=-4470, SQLSTATE=null
DB2读取CLOB字段-was报错:操作无效:已关闭 Lob. ERRORCODE=-4470, SQLSTATE=null 解决方法,在WAS中要用的数据源里面配置连个定制属性: progressi ...
随机推荐
- Jmeter如何保持cookie,让所有请求都能用同一个cookie,免去提取JSESSIONID
近期有柠檬班的学生找到华华,问了一个问题,就是利用Jmeter做接口测试的时候,如何提取头部的JSESSIONID然后传递到下一个请求,继续完成当前用户的请求. 其实,关于这个问题有三种种解决方法: ...
- js数组方法forEach,map,filter,every,some实现
Array.prototype.map = function(fun /*, thisp*/) { var len = this.length; if (typeof fun != "fun ...
- 《区块链100问》第13集:比特币和Q币有哪些不同?
比特币是一种去中心化的数字资产,没有发行主体.Q币是由腾讯公司发行的电子货币,类似于电子积分,其实不是货币. Q币需要有中心化的发行机构,Q币因为腾讯公司的信用背书,才能被认可和使用.使用范围也局限在 ...
- 基于Window10搭建android开发环境
一.安装JDK 1.下载(网页链接) 2.双击安装文件进行安装,安装在合适目录,例如:D:\Java\jdk1.8.0_201与D:\Java\jre1.8.0_201 3.设置环境变量 3.1.JA ...
- Spring容器是如何实现 Bean 自动注入(xml)
入口web.xml web.xml 配置文件 <!-- Spring Config --> <listener> <listener-class>org.sprin ...
- 初始ADO.NET数据操作
以下介绍直接来源与百度百科,介绍十分全面和详细,作为小菜的我们没有理由不看完这些枯燥的介绍原有: ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于 ...
- 7z
7zip是一款开源的解压缩软件,不仅自己独有的7z格式,而且支持zip,rar,tar,gzip等众多其他格式,同时7z格式的压缩比例很高,目前很多硬盘版的游戏都采用zip进行打包.下面介绍一下Lin ...
- nGrinder的安装与使用
背景 性能压测工具之前使用的是jmeter,这次说的是nGrinder,先直接搬运两者之间的比较 比较点 JMeter nGrinder 结果 实现语言 Java Java = License Apa ...
- app后端设计-- 数据库分表
当项目上线后,随着用户的增长,有些数据表的规模会以几何级增长,当数据达到一定规模的时候(例如100万条),查询,读取性能就下降得很厉害,这时,我们就要考虑分表. 更新表数据时会导致索引更新,当单表数据 ...
- 跟据经纬度实现附近搜索Java实现
现在很多手机软件都用附近搜索功能,但具体是怎么实现的呢>在网上查了很多资料,mysql空间数据库.矩形算法.geohash我都用过了,当数据上了百万之后mysql空间数据库方法是最强最精确的(查 ...