C#协作试取消线程
2023-09-14 09:12:36 时间
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;
}
这样是不是就可以正确的取消线程。
阅读 838
相关文章
- C#子线程中更新ui
- C#图片压缩的实现方法
- C#中的线程(二) 线程同步基础
- C#分析URL参数获取参数和值得对应列表(二)
- [C#] c# 验证手机号码 最新的17手机号
- Elastic Search 5.x Nest Multiple Queries C#
- C# winform 学习(二)
- c# 如何在一般处理程序中返回json
- C# 创建线程的简单方式:异步委托 .
- 重新整理数据结构与算法(c#)——算法套路迪杰斯特拉算法[三十一]
- c# 线程的优先级
- C# 日志类
- c# 操作Word总结
- 有关C,C++,C#, Java的图形图像处理类库 整理(未完待续)
- C# Socket 线程
- 【目录】C#搭建足球赛事资料库与预测平台与彩票数据分析目录
- Atitit. c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0 attilax总结 1. 版本历史1 1.1. C# 1.0-纯粹的面向对象2 1.2. C# 2.0
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- C#编程基础第六章:方法
- C#与Matlab混合编程之巴特沃斯低通滤波器(转)
- C# 线程同步
- C#使用线程池创建线程
- C#开发的OpenRA的OpenGL渲染显示
- 在C#主线程和子线程将数据传递给对方如何实现
- 多线程之旅(9)_如何安全的取消正在执行的线程——附C#源码
- C#中4种深拷贝方法介绍
- [C#]c#中数据的同步加锁机制 的几种方法
- C#winform-多线程【案例+源码】
在
Count
方法中需要使用cts.IsCancellationRequested
来判断当前线程是否已经被取消。if (cts.IsCancellationRequested) { Console.WriteLine( "计算取消" ); return; }