c#无限循环线程如何正确退出
c#无限循环线程如何正确退出
在主程序将要结束时,迅速正确退出无限循环执行的子线程。一般子线程循环执行会有一个指定的周期,
在子线程等待(或者睡眠)时,无法唤醒退出,尤其在执行周期较长时,子线程无法即刻退出,导致
程序无法迅速关闭。
1. 定义AutoReset
private AutoResetEvent exitEvent;
exitEvent = new AutoResetEvent(false);
此事件作为线程即将退出的信号,初始化为false。
2. 定义线程循环周期(睡眠周期)
int waitTime;
3. 定义线程执行
private void Process()
{
while (true)
{
Console.WriteLine("do some thing");
if (exitEvent.WaitOne(waitTime))
{
break;
}
}
}
在执行函数每次均等待退出信号若干时间,若没有退出信号则继续执行,若收到退出信号则立即退出。
可以避免使用sleep长时间睡眠无法立即退出。
4. 定义线程退出方法
public void Stop()
{
exitEvent.Set();
thread.Join();
}
全部代码
线程类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace threadexit
{
class ThreadA
{
private AutoResetEvent exitEvent;
private Thread thread;
private int waitTime;
public ThreadA(int time)
{
exitEvent = new AutoResetEvent(false);
waitTime = time;
thread = new Thread(new ThreadStart(Process));
}
public void Run()
{
thread.Start();
}
public void Stop()
{
exitEvent.Set();
thread.Join();
}
private void Process()
{
while (true)
{
Console.WriteLine("do some thing");
if (exitEvent.WaitOne(waitTime))
{
break;
}
}
}
}
}
主函数
static void Main(string[] args)
{
var t = new ThreadA(3000);
t.Run();
System.Threading.Thread.Sleep(10000);
Console.WriteLine(DateTime.Now.ToShortTimeString() + "begin stop thread");
t.Stop();
Console.WriteLine(DateTime.Now.ToShortTimeString() + "thread stoped");
Console.ReadKey();
}
c#无限循环线程如何正确退出的更多相关文章
- python的无限循环及退出
题目要求如下: 1 循环验证用户输入的用户名与密码 2 认证通过后,运行用户重复执行命令 3 当用户输入命令为quit时,则退出整个程序 代码如下 person={'name':'Helen','p ...
- 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- android-自定义广告轮播Banner(无限循环实现)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- 自定义完美的ViewPager 真正无限循环的轮播图
网上80%的思路关于Android轮播图无限循环都是不正确的,不是真正意义上的无限循环, 其思路大多是将ViewPager的getCount方法返回值设置为Integer.MAX_VALUE, 然后呢 ...
- Thread的中断机制(interrupt),循环线程停止的方法
一.中断原理 中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个 ...
- Java并发读书笔记:如何实现线程间正确通信
目录 一.synchronized 与 volatile 二.等待/通知机制 等待 通知 面试常问的几个问题 sleep方法和wait方法的区别 关于放弃对象监视器 三.等待通知典型 生产者消费者模型 ...
- 一行代码引入 ViewPager 无限循环 + 页码显示
(出处:http://www.cnblogs.com/linguanh) 前序: 网上的这类 ViewPager 很多,但是很多都不够好,体现在 bug多.对少页面不支持,例如1~2张图片.功能整合不 ...
- iOS开发系列--无限循环的图片浏览器
--UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件 ...
- 自己定义 ViewGroup 支持无限循环翻页之三(响应回调事件)
大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ################################ ...
随机推荐
- Storm(2015.08.12笔记)
2015.08.12Storm 一.Storm简介 Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架. Storm能实现高频数据和大规模数据的实时处理. 官网资料显示s ...
- 模块中为什么要加__name__ == "__main__"
写一个hello模块 #!/usr/sbin/env python #-*- coding:utf- -*- print "我是hello模块,我被执行了" 在另一个python程 ...
- WPF+AE开发小结--TOCControl右键菜单删除图层
1.WPF项目中添加toccontrol控件,如何添加,网上有很多方法,可自行搜索,这里不再赘述,代码如下 <Window x:Class="AE.MainWindow" x ...
- ASP.NET Core:使用Dapper和SwaggerUI来丰富你的系统框架
一.概述 1.用VS2017创建如下图的几个.NET Standard类库,默认版本为1.4,你可以通过项目属性进行修改,最高支持到1.6,大概五月份左右会更新至2.0,API会翻倍,很期待! 排名分 ...
- js的基本介绍
一:JavaScript简称js 他是个脚本语言,需要有宿主文件,他的宿主文件是html文件. 二:js的用法 js :1)进行数据运算 2) 控制浏览器的一些功能 3)控制元素 +元素 +样式 +内 ...
- 怎样获得PRINCE2证书?报名PRINCE2有什么条件?
参加培训:想要获得PRINCE2资格证书,参加培训是非常必要的,正规的培训机构有获得组织认证考试的权力.光环国际全年开设prince2课程班,全国各个地区均可以选择培训及考试 选择培训机构:只有经AP ...
- 老李分享: JSON
老李分享: JSON poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478, ...
- 老李知识普及:web安全性的两大权威组织
老李知识普及:web安全性的两大权威组织 两个重要的WEB应用安全组织-WASC/OWASPWeb Application Security Consortium (WASC)a.WEB应用安全标准的 ...
- 给我的cnblogs主页做一个响应式布局模板
在cnblogs,一直都是使用官方自带的那些模板,而且感觉也一直很良好!不过最近用手机搜索一些相关的技术资料,很多都来自cnblogs,有些博主的页面在和机端显得很好,有些则展示得不那么友好了……忽然 ...
- golang环境
Golang是谷歌开发的一款开源性语言,暂时比较方便的IDE有Inteillj Idea.LiteIDE.Eclipse(Golipse)等,使用起来比较方便的IDE:LiteIDE和Inteillj ...