C#程序关闭时保证所有线程结束的方法

一:问题描述

之前做一个c#项目,需要同时接收几个IP的TCP信息,还需要同时保存数据到关系数据库和时序数据库,还需要同时接收几个硬件信息,总之线程乱七八糟。之前关闭程序时老是遇到各种问题:

1)相机对象已经dispose了,线程还在读其缓存中的内容

2)tcp连接已经关闭了,还在读read tcp消息

。。。

各种五花八门的错,查看很多资料,在Form_closed函数中加了这句话:

System.Diagnostics.Process.GetCurrentProcess().Kill();

嗯,kill的特别干净,再也不报那些乱七八糟的错了,但新的问题出现了:

因为项目连着工业相机硬件,kill的时候不知道为什么把相机程序也给kill掉了,整一个大无语。程序变成一次性的,就是第一次打开程序可以找到相机,关闭之后再打开就找不到相机了......

二:解决方法

又查询了很多资料,解决方法如下:

1)每一个新创建的Thread后都要跟一个IsBackground=true命令,确保主线程退出时后台线程也跟着退出

2)Form_closed函数中的命令改成:

System.Environment.Exit(0);

这是一个比较彻底的线程退出方式。

目前运行看还没什么问题,有问题再继续更新......

相关推荐
山风wind2 分钟前
设计模式-单例模式详解
开发语言·javascript·ecmascript
未来之窗软件服务4 分钟前
幽冥大陆(五十三)人工智能开发语言选型指南——东方仙盟筑基期
开发语言·人工智能·仙盟创梦ide·东方仙盟
后端小张6 分钟前
【JAVA 进阶】深入理解Sentinel:分布式系统的流量守卫者
java·开发语言·spring boot·后端·spring·spring cloud·sentinel
cheems95277 分钟前
[JavaEE] CAS 介绍
java·开发语言·java-ee
zore_c12 分钟前
【数据结构】栈——超详解!!!(包含栈的实现)
c语言·开发语言·数据结构·经验分享·笔记·算法·链表
lkbhua莱克瓦2413 分钟前
IO练习——登入注册
java·开发语言·io流·java练习题
Reuuse14 分钟前
登录突然失效:Axios 拦截器判空、localStorage 脏数据与环境变量踩坑
开发语言·前端
月明长歌15 分钟前
【码道初阶】【Leetcode105&106】用遍历序列还原二叉树:前序+中序、后序+中序的统一套路与“先建哪边”的坑
java·开发语言·数据结构·算法·leetcode·二叉树
Oliver_LaVine22 分钟前
java后端实现全链路日志ID记录
java·开发语言·spring
木头软件25 分钟前
批量将 Word 文档重命名为其标题
开发语言·c#·word