18910140161

C#窗体关闭后进程不关闭的解决方案

顺晟科技

2021-08-28 09:39:46

73

今天,在使用C#的winform开发串口读写程序时,又因为需求而创建了另一个子线程。当主窗体关闭,关闭程序再次启动时,表明串口被占用。经过一番搜索,发现之前关闭表单后,程序在这个过程中并没有完全关闭。

针对这个问题,找到了一些数据,将C#中WinForm表单程序的退出方法总结如下:

1.这个。Close():只要关闭当前窗口,如果不是主窗体,就不能退出程序,如果有托管线程(非主线程),就不能干净利落地退出;

2.申请。Exit():强制所有消息中止并退出所有表单,但如果有托管线程(非主线程),则无法干净退出;

3.申请。exitsthread():强制中止调用线程上的所有消息,同时也面临其他线程无法正确退出的问题;

4.系统。Environment.Exit(0):这是最彻底的退出方式,无论强制退出什么线程,程序都干净利落地完成了。

根据以上三种方法(不考虑this.close()方法),测试代码创建如下:

公共部分类表格1 :表格

{

公共表单1()

{

InitializeComponent();

//打开子线程

this . back thread();

}

/*

*打开子线程

*/

私有void backThread()

{

thread start thread=new thread start(back pro);//线程启动委托

Thread Thread=new Thread(Thread start);

线。优先级=线程优先级。正常;

线。IsBackground=false

//启动子线程

线。start();

}

/*

*子线程处理方法

*/

公共void backPro()

{

虽然(真)

{

线程。睡眠(1000);

}

}

私有void Form1_FormClosing(对象发送方,FormClosingEventArgs e)

{

//应用。exit();//无法完全关闭进程

//应用。exit thread();//无法完全关闭进程

系统。环境。退出(0);//完全关闭进程

}

}

上述代码的测试结果如下:

1.该程序可以完全关闭,而无需打开子线程

2.打开子线程后,应用程序。退出()和应用程序。ExitThread()方法无法完全关闭程序,在任务管理器的“进程”中仍然可以看到进程没有关闭;仅系统。环境。退出(0)可以完全关闭程序

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航