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--调试、线程、正则表达式
一.错误.调试和测试 二.进程和线程 三.正则表达式
随机推荐
- C++ 继承及委托
从内存角度看继承和多重继承 http://www.doc88.com/p-9075148832569.html 在C++中实现委托(Delegate) https://blog.csdn.net/jf ...
- 从新建文件夹开始构建ShadowPlay Engine游戏引擎(3)
本篇序言 各位可能看到博文的名字换了,也就是引擎名字换了,其实是在下想到了一个更棒的名字:皮影戏(ShadowPlay),取这个名字的含义是因为,游戏中的角色(Puppet)不也是由于我们的操作而动起 ...
- 前端-HTML标签
1.<p></p>段落标签 <p>别在最该拼搏的年纪选择稳定,世界上最大的不变是改变,只有每天进步,才能拥抱生命的无限可能!</p> 2.</b& ...
- python根据正则表达式生成指定规律的网址
import os def file_name(file_dir): for root, dirs, files in os.walk(file_dir): print(root) #当前目录路径 p ...
- DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。
DWA(动态窗口)算法是用于局部路径规划的算法,已经在ROS中实现,在move_base堆栈中:http://wiki.ros.org/dwa_local_planner DWA算法第一次提出应该是1 ...
- Jenkins 进阶篇 - 参数化构建
我们在构建任务时经常会遇到这样的情景,一个任务配置好了以后,在后面的构建过程中,又会修改一些配置.例如,我们构建项目的代码可能是拉取指定的分支或者是Tag进行构建,又或者是在构建是需要指定特定的运行平 ...
- 添加数据时报错:An error occurred while updating the entries. See the inner exception for detail。
场景:前几天在项目开发时,有个bug经常出现,今天花了一整天,终于把它解决了.记录一下解决流程. 解决方法: 主要报错的地方在添加的部分: 1 foreach (var requestProperty ...
- 如何实现让div垂直居中,左右10px,高度始终为宽度一半
方法一:利用height:0; padding-bottom: 50%; <!DOCTYPE html><html lang="en"> <head& ...
- 文件上传之WAF绕过及相安全防护
文件上传在数据包中可修改的地方 Content-Disposition:一般可更改 name:表单参数值,不能更改 filename:文件名,可以更改 Content-Type:文件 MIME,视情况 ...
- rancherUI添加configmap
1.创建configmap 2.部署pod,挂载配置文件(通过卷的形式引用)