C#协作试取消线程
https://segmentfault.com/q/1010000017109927
using System;using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace 取消线程池中线程
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine( "主线程运行" );
CancellationTokenSource cts = new CancellationTokenSource( );
//ThreadPool.QueueUserWorkItem(CallBack, cts.Token );
ThreadPool.QueueUserWorkItem(CallBack, cts);
Console.WriteLine( "按下回车键取消启动的线程" );
Console.Read( );
cts.Cancel();
Console.ReadKey();
}
public static void CallBack( object state )
{
CancellationTokenSource cts = (CancellationTokenSource)state;
Console.WriteLine( "开始计数" );
Count( cts, 5 );
}
private static void Count(CancellationTokenSource cts, int countto )
{
for( int i=0; i<=countto+10; ++i) {
if( i== countto) {
cts.Cancel();
Console.WriteLine( "计算取消" );
//return;
}
Console.WriteLine( "计算为:{0}, 当前线程ID: {1}", i, Thread.CurrentThread.ManagedThreadId );
Thread.Sleep(300);
}
Console.WriteLine("计数完成");
}
}
}
很明显在调用cts.Cancel()后Count()函数还在执行,看到书上说CancellationTokenSource是协助式取消线程,刚学多线程,很多不明白的。
我们将一些任务(函数)放在某一个线程中执行,如果任务终止是不是就代表线程取消了
上述代码如果改为:
if( i== countto) {
cts.Cancel();
Console.WriteLine( "计算取消" );
return;
}
这样是不是就可以正确的取消线程。
在 Count
方法中需要使用 cts.IsCancellationRequested
来判断当前线程是否已经被取消。
if (cts.IsCancellationRequested)
{
Console.WriteLine( "计算取消" );
return;
}
C#协作试取消线程的更多相关文章
- Linux学习笔记23——取消线程
一 相关函数 1 发送终止信号 #include <pthread.h> int pthread_cancel(pthread_t thread); 2 设置取消状态 #include & ...
- pthread中取消线程
取消线程:告诉一个线程关掉自己,取消操作允许线程请求终止其所在进程中的任何其他线程.不希望或不需要对一组相关的线程执行进一步操作时,可以选择执行取消操作.取消线程的一个示例是异步生成取消条件. 对于c ...
- linux下pthread_cancel无法取消线程的原因【转】
转自:http://blog.csdn.net/huangshanchun/article/details/47420961 版权声明:欢迎转载,如有不足之处,恳请斧正. 一个线程可以调用pthrea ...
- linux下pthread_cancel无法取消线程的原因
一个线程能够调用pthread_cancel终止同一进程中的还有一个线程,可是值得强调的是:同一进程的线程间,pthread_cancel向还有一线程发终止信号.系统并不会立即关闭被取消线程,仅仅有在 ...
- 【C#】线程协作式取消
Microsoft .Net Framework 提供了一个标准的取消操作的模式.这个模式是协作式的,意味着你想取消的操作必须显示地支持取消. CLR为我们提供了两个类: System.Threadi ...
- Linux 进程与线程二(等待--分离--取消线程)
int pthread_join(pthread_t thr,void **thr_return); pthread_join函数用于挂起当前线程,直至th指定的线程终止为止. 如果另一个线程返回值不 ...
- CancellationTokenSource 和 CancellationToken 取消线程
Main 程序[分别调用三个方法] static void Main(string[] args) { using (CancellationTokenSource cts = new Cancell ...
- 线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程
一. pthread_create() #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_a ...
- day4 liaoxuefeng--调试、线程、正则表达式
一.错误.调试和测试 二.进程和线程 三.正则表达式
随机推荐
- 利用漏洞破解win7密码
一.利用5次shift漏洞破解win7密码 1.在未登录系统时,连续按5次shift键,弹出程序:C:\Windows\system32\sethc.exe 2.部分win7及win10可通过系统修复 ...
- 做词云时报错cannot import name ‘WordCloud‘ from partially initialized module ‘wordcloud‘的解决办法
问题: 在做词云时,运行时出现该问题,wordcloud安装成功,但运行出错,错误提示是:cannot import name 'WordCloud' from partially initializ ...
- 三、k8s集群可用性验证与调参(第一章、k8s高可用集群安装)
作者:北京小远 出处:http://www.cnblogs.com/bj-xy/ 参考课程:Kubernetes全栈架构师(电脑端购买优惠) 文档禁止转载,转载需标明出处,否则保留追究法律责任的权利! ...
- 备战-Java IO
备战-Java IO 君如载酒须尽醉,醉来不复思天涯. 简介:备战-Java IO. 一.概述 Java 的 I/O 大概可以分成以下几类: 磁盘操作:File 字节操作:InputStream 和 ...
- Java基础00-方法引用32
1. 方法引用 Java8新特征之方法引用 1.1 体验方法引用 代码示例: 需求: 1:定义一个接口(Printable):里面定义一个抽象方法: void printString(String s ...
- js学习-es6实现枚举
最近大部分时间再写dart,突然用到js,发现js不能直接声明一个枚举.搜索发现还是有实现的方式,于是总结一下. 目录 枚举特点 Object.freeze() Symbol 实现 体现不可更改 体现 ...
- 算法基础~链表~排序链表的合并(k条)
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
- python -- 结构数据类型(列表、元组、集合、字典)
一.列表 列表表示一组有序的元素,这些元素可以是数字.字符串,也可以是另一个列表. # ----------------------------------------# 列表(list):一组有序的 ...
- 【codeforces1058】Vasya and Golden Ticket 枚举+暴力+模拟
#点击传送 题目描述 Recently Vasya found a golden ticket - a sequence which consists of nn digits a1a2-ana1a2 ...
- synchronized锁机制(六)
前言 1.理解同步关键词synchronized 2.同步方法与同步代码块的区别 3.理解锁的对象this 脏读 一个常见的概念.在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的 ...