黑马程序员 关于c# windows窗体关闭时线程未能完全退出问题(专题一)
<a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>
前几天在用c# windows窗体编写坦克大战游戏时曾用过线程,在程序退出后会发现还有线程在后台运行(打开任务管理器可以看到) 现在用一部分代码来表达: public Form1() { InitializeComponent(); IPEndPoint ipendpoint=new IPEndPoint(IPAddress.Parse(txtIP.Text),int.Parse(txtPort.Text)); socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipendpoint); socket.Listen(10); } }
上边的代码无需看懂;
接下来我再刚才的Form1()中添加如下代码:
即: public Form1() { 。。。。。。。
//一下为添加代码
Thread threadlisten = new Thread(new ThreadStart(ThreadListen)); threadlisten.Start(); }
当然程序中代码不仅仅如此,在此仅为说明问题才列出以上代码。
之后运行窗体程序后,关闭窗体。
在任务管理器中发现刚才的程序线程还在后台运行(如果你现在在运行该程序,vs就会报错提示有线程正在访问)
为什么会出现这个问题?
难道是关闭时没写线程销毁。
所以我又在程序中添加了如下代码:
this.Dispose();
或者
Application.Exit();
等代码,结果于事无补。
怎么解决哪?
那么就要分析线程的优先级以及线程的销毁周期
我们都知道程序退出的依据是当前程序的所有前台线程都退出(记住是前台线程),在一个正常的windows程序下,我们没有用线程,所以在退出时,
直接退出UI线程,即窗体就退出了当前程序;然而,我们一旦在程序中附加线程,那么默认情况下该线程也为前台线程,所以,我们在退出Ui(窗体)
时,并没有退出附加线程。
所以我们想办法把我们附加的线程变为后台线程即可。
在我们上面编的程序中加上threadlisten.IsBackground=True;
public Form1()
{
。。。。。。。
//一下为添加代码
Thread threadlisten = new Thread(new ThreadStart(ThreadListen));
threadlisten.IsBackground=True;
threadlisten.Start();
}
之后就可以正常退出。
<a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>
黑马程序员 关于c# windows窗体关闭时线程未能完全退出问题(专题一)的更多相关文章
- 黑马程序员+Winform基础(上)
黑马程序员+Winform基础 ---------------<a href="http://edu.csdn.net"target="blank"> ...
- 黑马程序员:Java基础总结----GUI图形化界面
黑马程序员:Java基础总结 GUI图形化界面 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! GUI(Graphical User Interface)图形化界 ...
- 黑马程序员:Java基础总结----网络编程
黑马程序员:Java基础总结 网络编程 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...
- 黑马程序员:3分钟带你读懂C/C++学习路线
随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...
- 黑马程序员——【Java高新技术】——代理
---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...
- 黑马程序员+SQL基础(上)
黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...
- 黑马程序员—C语言的函数、数组、字符串
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
随机推荐
- 藏妹子之处(excel)
问题描述: 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同 ...
- Linux/windows查看设置环境变量指令
一.Linux: 1.查看所有环境变量的指令 方法1:$:export (export命令作用是显示.设置或删除linux环境变量:) 方法2:$:env 2.查看某个指定的环境变量 方法1:$:ex ...
- mcp2515 芯片驱动总线错误BUG的解决方法
http://blog.renren.com/share/221002615/11483613167 来自张涛的日志 现象:CAN总线在线上设备热插拔或长时间运行后出现总线异常情况,有时不能发送和接收 ...
- 17、Java并发性和多线程-避免死锁
以下内容转自http://ifeve.com/deadlock-prevention/: 在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按 ...
- 联想YOGA3一键恢复系统教程
- linux下nginx+svn
http://fengqi.me/unix/23.html 因为没有什么可以定制的, 所以svn直接使用系统自带的包管理软件安装, 以centos系列为例, 命令如下: yum install sub ...
- SuperSwipeRefreshLayout 一个功能强大的自己定义下拉刷新组件
SuperSwipeRefreshLayout 一个功能强大的自己定义下拉刷新组件. Why? 下拉刷新这样的控件.想必大家用的太多了,比方使用非常多的XListView等. 近期.项目中非常多列表都 ...
- 用WebCollector爬取新浪微博数据
教程已转移:http://datahref.com/archives/28 WebCollector爬取新浪微博等完整演示样例project可加群250108697或345054141从群文件里下载. ...
- PHP移动互联网开发笔记(3)——运算符
原文地址:http://www.php100.com/html/php/rumen/2014/0326/6704.html 一.PHP的运算符 PHP中有丰富的运算符集,它们中大部分直接来自于C语言. ...
- Ubuntu12.04.3LTS安装Oracle Java 7
今天在ubuntu 12.04 LTS 上安装Matlab时总是出错,显示拷贝jar包(cp "xx.jar")出现错误,在网上搜索了一下发现原来是没有安装java.自己打算安装o ...