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”的错误的更多相关文章

  1. 解决com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭

    com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭. at com.microsoft.sqlserver.jdbc.SQLServerEx ...

  2. ASP.NET Aries 2.0 发布(原来的源码SVN已关闭,开源源码已迁移到GitHub)

    主要更新: 1:增加子目录部署支持. 2:增加Taurus.MVC支持. 3:优化及Bug修复. 1:增加子目录部署支持: 其实在重写Aries框架的时候,我是去掉了目录部署功能的,主要是为了加快Ar ...

  3. [转载]使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理

    转载,原文来自 http://blog.csdn.net/hawksoft/article/details/21776009 最近调试原来的微信模拟登陆时发生了“基础连接已关闭,发送时发生错误”的错误 ...

  4. (微信API接口开发) 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理

    最近调试原来的微信模拟登陆时发生了“基础连接已关闭,发送时发生错误”的错误提示,原来都是好好的,只是很久没用了. 出错代码如下: HttpWebRequest req = (HttpWebReques ...

  5. Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流的解决方法

    原本在CS项目中用的好好的在BS项目中既然提示我导出出现无法访问已关闭的流的解决方法 比较郁闷经过研究 终于解决了先将方法发出来 让遇到此问题的筒子们以作参考 //新建类 重写Npoi流方法 publ ...

  6. outlook2010怎么老提示IMAP服务器已关闭连接啊

      最近在Outlook中使用 网易 163邮件的IMAP功能时,发现接收邮件的速度非常慢,才几封邮件就花了至少15分钟才停止了同步邮件服务器的过程,然后提示一个对话框:"IMAP 服务器已 ...

  7. 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理

    原文地址:http://blog.csdn.net/hawksoft/article/details/21776009 最近调试原来的微信模拟登陆时发生了“基础连接已关闭,发送时发生错误”的错误提示, ...

  8. 多线程下System.Security.Cryptography.Aes CreateDecryptor报“Safe handle has been closed”的解决方案

    因为系统需要对一些核心数据进行预加载以保证查询速度. 所以在application_start 事件中启用了后台线程对相关的数据进行加载并解密(为了保证解密的效率,将AES对像做了静态对像来保存:pr ...

  9. DB2读取CLOB字段-was报错:操作无效:已关闭 Lob。 ERRORCODE=-4470, SQLSTATE=null

    DB2读取CLOB字段-was报错:操作无效:已关闭 Lob. ERRORCODE=-4470, SQLSTATE=null 解决方法,在WAS中要用的数据源里面配置连个定制属性: progressi ...

随机推荐

  1. 以python代码解释fork系统调用

    import os print('Process (%s) start...' % os.getpid()) # Only works on Unix/Linux/Mac: pid = os.fork ...

  2. 洛谷 P5206: bzoj 5475: LOJ 2983: [WC2019] 数树

    一道技巧性非常强的计数题,历年WC出得最好(同时可能是比较简单)的题目之一. 题目传送门:洛谷P5206. 题意简述: 给定 \(n, y\). 一张图有 \(|V| = n\) 个点.对于两棵树 \ ...

  3. python_ssh连接

    首先下载paramikopip install paramiko查看并启动ssh服务service ssh status 添加用户:useradd -d /home/zet zetpasswd zet ...

  4. mysqldump只导出表结构或只导出数据的实现方法【转】

    mysql mysqldump 只导出表结构 不导出数据 mysqldump --opt -d 数据库名 -u root -p > xxx.sql 备份数据库 #mysqldump 数据库名 & ...

  5. springcloud配置详解

    Spring Boot的配置参考Spring Boot系列文章,这里只对Spring Cloud用到的配置解释. spring.application.name:配置应用名称,在注册中心中显示的服务注 ...

  6. spring-dao.xml 模板

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  7. mysql存储表情字符

    windows下是my.inilinux下是my.cnf 路径是: /etc/my.cnf 参考: https://blog.csdn.net/fhzaitian/article/details/53 ...

  8. [转]solver优化方法

    原文地址:http://www.cnblogs.com/denny402/p/5074212.html 到目前为止,caffe总共提供了六种优化方法: Stochastic Gradient Desc ...

  9. Heist

    CF#509 div2 A 第一次用自己的号打CF祭. 题目描述 昨晚有一家电子商店被抢劫了. 昨天在商店里的所有键盘都是从x开始按升序编号的.例如,如果x=4,并且商店中有3个键盘,那么编号就为4, ...

  10. jq选择子元素

    jq选择子元素 一.获取父级元素 1. parent([expr]): 获取指定元素的所有父级元素 <div id="par_div"><a id="h ...