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#程序设计有所帮助。

除声明外,跑步客文章均为原创,转载请以链接形式标明本文地址
  C#实现终止正在执行的线程

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23541.html

相关内容

C#实现异步编程的方法

C#使用GET、POST请求获取结果

NGUI实现滑动翻页效果实例代码

结合.net框架在C#派生类中触发基类事件及实现接口事件


C#预定义数据类型之值类型和引用类型介绍

C#自定义RSA加密解密及RSA签名和验证类实例

WinForm自定义函数FindControl实现按名称查找控件

C#利用反射来判断对象是否包含某个属性的实现方法

时间: 2024-08-10 16:34:02

C#实现终止正在执行的线程的相关文章

C#实现终止正在执行的线程(转))

这篇文章主要介绍了C#实现终止正在执行的线程的方法,针对临界资源等容易出现错误的地方进行了分析,并提出了改进方案与实例,需要的朋友可以参考下. 本文实例讲述了C#实现终止正在执行的线程的实现方法,并针对一些容易出错的地方进行了深入分析,具体方法如下: 一般来说,很多人都会使用Abort方法来终止线程,其实这种做法并不可取!如果你的线程正在操作临界资源,很有可能会造成资源没有正确释放而出现死锁问题.正确的做法应该是使用标记来终止线程的执行. 基本思路是:定义一个用于描述“停止”信号的变量,在整个程

Windows编程 - 终止可执行(exe)程序 代码(C++)

终止可执行(exe)程序 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 终止可执行(exe)程序, 首先遍历进程, 找到进程名称对于的进程ID号, 然后根据进程ID, 终止进程. 示例代码: 包括遍历进程代码, 和关闭代码. 代码: /* * main.cpp * * Created on: 2014.06.08 * Author: Spike */ /*vs 2012*/ #include <iostream> #include <

C# 多线程join的用法,等待多个子线程结束后再执行主线程

等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = new Thread[2]; ths[0] = new Thread(Method1); ths[1] = new Thread(Method2); foreach (Thread item in ths) { //首先让所有线程都启动 item.Start(); //试想一下在这里加上item.

关于回调函数执行的线程

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public delegate void PrintCallback(int i); static void Main(st

Android-Service中执行新线程的几种方式

大家都知道,service和activity都是运行在UI线程中,超时的数据读取和网络耗时等操作必须新建线程,下面说说service中执行新线程的几种方式. 1.传统的java方式 我们都知道 java中新建线程可以继承Thread类,也可以implement Runnable接口.实质都是实现Runnable的run方法,此处底层应该是jvm识别run这个方法分配并且创建了线程.run方法只是准备好了新线程的资源,要调用 start() native方法才能启动线程. 1 public int

怎样终止正在执行的程序

用MATLAB仿真LMS算法,可是程序一不小心就会溢出,程序RUN一次时间又很长,所以希望能当判断到某个数为INF时就让程序停止下来. 开始查到了快捷键:Ctrl+C,但是我知道它是不能判断的,只能手动. 之后又看到有人提到:error,return,break等函数 Error : Return:退出调用的函数,在help 中有这样的例子. Example function d = det(A) if isempty(A) d = 1; return else ... end Break:退出

不同浏览器对终止脚本执行有不同的判断标准:

不同浏览器对终止脚本执行有不同的判断标准: IE监控脚本执行的语句和数量.当执行的语句的数量达到最大限定值,默认为500万,就会弹出终止脚本运行的对话框. Firefox监测脚本运行的总时间.当超过预先设定的时间,默认为10秒,就会终止脚本运行的对话框. Safari也是通过执行时间来检测脚本是否为长时间运行.默认超过设置为5秒,超时就会弹出终止脚本运行的对话框. Chrome 1.0没有限制JavaScript允许执行的最长时间.当出现内存不足时进程就会崩溃. Opera是唯一没有提供监测长时

C/C++程序终止时执行的函数——atexit()函数详解

很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束.在程序的某个地方用exit()结束程序.用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理.方法就是用atexit()函数来注册程序正常终止时要被调用的函数. atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数.atexit()的函数原型是:#include <cstdlib

javascript 终止函数执行操作

1.如果终止一个函数的用return即可,实例如下:function testA(){    alert('a');    alert('b');    alert('c');}testA(); 程序执行会依次弹出'a','b','c'. function testA(){    alert('a');    return;    alert('b');    alert('c');}testA(); 程序执行弹出'a'便会终止. 2.在函数中调用别的函数,在被调用函数终止的同时也希望调用的函数