C#实现终止正在执行的线程
作者:shichen2014 发布时间:2022-05-06 22:34:22
标签:C#,终止,线程
本文实例讲述了C#实现终止正在执行的线程的实现方法,并针对一些容易出错的地方进行了深入分析,具体方法如下:
一般来说,很多人都会使用Abort方法来终止线程,其实这种做法并不可取!如果你的线程正在操作临界资源,很有可能会造成资源没有正确释放而出现死锁问题。正确的做法应该是使用标记来终止线程的执行。
基本思路是:定义一个用于描述“停止”信号的变量,在整个程序启动前,设置该变量为false。在线程中,循环判断该变量是否已经被设置为true,如果没有,则继续执行,否则就退出循环并释放资源,然后退出执行。当我们需要线程退出时,只要设置这个“停止”信号为true即可。
下面我们来看具体的操作步骤。
首先定义一个“停止”信号变量:
private volatile bool canStop = false;
注意这里我们使用了volatile关键字,因为canStop变量将会被调用线程和执行线程同时使用,即在调用线程中初始化以及设置它的值,而在执行线程中判断它的值。这样做就告诉编译器,这个canStop变量将被多个线程所使用,强制编译器不对其状态进行优化。如果有兴趣可以上MSDN查看关于这个volatile关键字的更多解释。此处同时也给canStop做了初始化。
现在我们看看线程的创建与执行的代码:
i = 0;
// 使用匿名方法定义线程的执行体
Thread thread = new Thread(
delegate(object param)
{
// 等待“停止”信号,如果没有收到信号则执行
while (!canStop)
{
i++;
UpdateLabel(i);
}
// 此时已经收到停止信号,可以在此释放资源并
// 初始化变量
canStop = false;
});
thread.Start();
很简单,在线程的执行体中反复判断canStop变量是否为true,若是则立刻跳出while循环(停止变量的自加以及更新界面的操作),然后重新初始化canStop变量为false,以便于下次的使用。
希望本文所述对大家的C#程序设计有所帮助。


猜你喜欢
- 1.先定义一个Java对象Person:public class Person{ String name; int age; int num
- char 字符char代表一个Unicode字符,它是System.Char的别名char someChar = 'a';/
- 本文介绍的是关于Mybatis中用OGNL表达式处理动态sql的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:常用的Mybat
- 1、cmd指令,进入.svn目录,找到wc.db文件 sqlite 3 打开2、 对 svn源代码目录 右键, clean up, 稍等1至
- TabControl控件中TabPage选项卡切换时的触发事件选项卡切换触发的是TabControl控件的SelectedIndexChan
- 前言Emmmm…最近在做项目的途中,有遇到一个方法需要接收的参数只有一个或者较少的时候就懒得写实体类去接收,使用spr
- 本文实例讲述了java和javascript中过滤掉img形式的字符串不显示图片的方法。分享给大家供大家参考。具体实现方法如下:1. jav
- 本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下:问题描述:给定n个矩阵:A1,A2,...,An,其中A
- 简单介绍2020年注定是不平凡的一年,新冠肺炎肆虐全球,传染性特别强,目前全球感人人数还在逐渐攀升,作为中华儿女特别感谢政府作出的努力,非常
- Android 中下拉菜单,即如html中的<select>,关键在于调用setDropDownViewResource方法,以
- 1、背景一般情况下,有些搜索需求是需要根据拼音和中文来搜索的,那么在elasticsearch中是如何来实现基于拼音来搜索的呢?可以通过el
- idea乱码修改bin目录下的idea.exe.vmoptions无效今天在学习Activiti工作流的时候,发现创建bpmn文件总是出现中
- pom配置<?xml version="1.0" encoding="UTF-8"?>&
- 面向对象三要素:封装、继承、多态。封装和继承,这两个比较好理解,但要理解多态的话,可就稍微有点难度了。今天,我们就来讲讲多态的理解。我们应该
- 本文实例讲述了java基于JDBC连接Oracle 11g Release2的方法。分享给大家供大家参考。具体如下:Oracle 11g R
- 1、cookie是啥?随手百度了网友的说说简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在
- 外观模式: 又称门面模式: 外观Facade为子系统的一组接口提供一个一致界面,使得这组子系统易于使用(通过引入一个新的外观角色降低原系统复
- 创建普通Maven工程导入所需依赖坐标:<dependencies> <!-- https://
- 一、Mybatis中的延迟加载1、延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用associ
- SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基