C# 中 多线程同步退出方案 CancellationTokenSource
C# 中提供多线程同步退出机制,详参对象: CancellationTokenSource
CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用,需重新初使化对象。
代码示例:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace CancellationTokenSourceTest
{
class Program
{ static void Main(string[] args)
{
//一种多线程取消任务开关对象
CancellationTokenSource s1 = new CancellationTokenSource();
CancellationTokenSource s2 = new CancellationTokenSource(); //s1 , 或者 s2 取消,导致 s3 取消
CancellationTokenSource s3 = CancellationTokenSource.CreateLinkedTokenSource(s1.Token, s2.Token); //异步执行结束 回调
s1.Token.Register(new Action(() => {
Console.WriteLine("线程{0} 执行回调!", System.Threading.Thread.CurrentThread.ManagedThreadId);
})); s2.Token.Register(new Action(() =>
{
Console.WriteLine("线程{0} 执行回调!", System.Threading.Thread.CurrentThread.ManagedThreadId);
})); s3.Token.Register(new Action(() =>
{
Console.WriteLine("线程{0} 执行回调!", System.Threading.Thread.CurrentThread.ManagedThreadId);
})); //异步执行
ThreadPool.QueueUserWorkItem(new WaitCallback(Print), s1.Token); //Token 中包含回调信息,执行结束 触发 Register 关联方法。
// System.Threading.Thread.Sleep(2000);
ThreadPool.QueueUserWorkItem(new WaitCallback(Print), s2.Token);
// System.Threading.Thread.Sleep(2000);
ThreadPool.QueueUserWorkItem(new WaitCallback(Print), s3.Token); Console.WriteLine();
s2.CancelAfter(3000); //若各线程传递各自tocken ,执行回调线程: s2 , s3
//s1.CancelAfter(3000); //若各线程传递各自tocken ,执行回调线程: s1 , s3 //s3.Cancel(); //若各线程传递各自tocken ,只触发 s3 , 不会触发 s1 , s2 回调。 //注意: 若各线程传递s3.token , s1 , s2 任意Cancle , s1 , s2 , s3 均会回调。 Console.ReadKey(); } static void Print(object objToken) {
CancellationToken token = (CancellationToken)objToken;
Console.WriteLine("Print , 开始等待{0}...", System.Threading.Thread.CurrentThread.ManagedThreadId);
if (token.WaitHandle.WaitOne()) {
Console.WriteLine( "直到 调用 Cancel() 执行此处 ");
} //while (!token.IsCancellationRequested) {
// //调用Cancel() 后 退出循环
//} Console.WriteLine("执行退出 {0}!" , System.Threading.Thread.CurrentThread.ManagedThreadId);
} }
}
C# 中 多线程同步退出方案 CancellationTokenSource的更多相关文章
- Delphi 中多线程同步的一些处理方法
Delphi 中多线程同步的一些处理方法 当创建了多个线程,并且多个线程都要访问同一资源,,就有可能出现混乱,于是用Synchronize来控制,使同一时间只有一个线程使用那部分资源,Synchr ...
- [delphi]在DLL中多线程同步Synchronize卡死问题
在dll中多线程同步调用Synchronize不可以,会出现假死卡住的现象.可通过Sendmessage实现. 转网上其他文章解释: Application.Initialize; begin ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- Java中多线程同步类 CountDownLatch
在多线程开发中,常常遇到希望一组线程完成之后在执行之后的操作,java提供了一个多线程同步辅助类,可以完成此类需求: 类中常见的方法: 其中构造方法:CountDownLatch(int count) ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作 (转)
https://www.cnblogs.com/tommyheng/p/4104552.html 本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做de ...
- iOS中多线程的实现方案
什么是主线程? 一个iOS程序运行后,默认会开启一条线程,称为“主线程”或“UI线程” 主线程的主要作用 1.显示/刷新UI界面 2.处理UI事件(比如点击事件,滚动事件,拖拽事件) 主线程的使用注意 ...
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.zejian.test; /** * @author ...
- iOS中多线程知识总结(一)
这一段开发中一直在处理iOS多线程的问题,但是感觉知识太散了,所以就把iOS中多线程的知识点总结了一下. 1.基本概念 1)什么是进程?进程的特性是什么? 进程是指在系统中正在运行的一个应用程序. ...
- C#中的多线程 - 同步基础
原文:http://www.albahari.com/threading/part2.aspx 文章来源:http://blog.gkarch.com/threading/part2.html 1同步 ...
随机推荐
- 后缀数组:倍增法和DC3的简单理解
一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n- ...
- WebForm 控件
一.简单控件 1.Label(作用:显示文字) Web中: <asp:Label ID="Label1" runat="server" Text=&quo ...
- SLAM初探-SLAM for Dummies
SLAM综述性特别是原理讲述比较浅显易懂的的资料比较少,相对比较知名的是<SLAM for Dummies>,但中文资料相对较少,这里就简单概述一下<SLAM for Dummies ...
- 代码性能优化——task
var t1 = Task.Factory.StartNew(delegate { //代码(查接口.数据库) }); 缺点: 不能使用request( HttpContext.Current.Req ...
- smarty模板中如何嵌入javascript脚本
[官方网站](http://www.php100.com/manual/smarty/) 在smarty文件里直接写javascript代码时候,造成500错误. javascript代码有很多的{} ...
- yii2 renderPartial
在 views/news/_copyright.php 中插入以下代码: <div> This is text about copyright data for news items &l ...
- NodeJS 初体验
console.log('%s: %d', 'Hello', 25); // 可以像C语言格式一样输出//app.jsvar http = require('http');http.createSe ...
- svn使用
1 svn地址: svn://www.svn999.com/annie123.test12345 2 svn 账户: 账户使用时期:项目checkout时期 会提示键入用户名密码 3 新增文件 (1) ...
- 常见的JavaScript函数
JavaScript函数一共可分为5类:常规函数.数组函数.日期函数.数学函数和字符串函数. (1)常规函数(9个) alert函数:显示一个警告对话框,包括一个“确定”按钮. confirm函数:显 ...
- Java_Swing程序设计_尝试开发一个登陆窗体,包括用户名、密码以及提交按钮和重置按钮,当用户输入用户名my,密码love时,弹出登陆成功提示对话框。
package com.lzw; import java.awt.*;import java.awt.event.*; import javax.swing.*; public class UseCa ...