task CancellationTokenSource
使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何控制的)。而CancellationTokenSource则是外部对Task的控制,如取消、定时取消。
CancellationTokenSource 中暂未提供复位操作,因此当调用Cancle 之后,若再次调用,需重新初使化对象。
Demo:
CancellationTokenSource tokenSource = new CancellationTokenSource();
Task[] tasks = new Task[2];
string url = "www.baidu.com";
bool isconn = true;
tasks[0] = Task.Run<bool>(() =>
{
Ping ping = new Ping();
try
{
PingReply pr;
pr = ping.Send(url);
Thread.Sleep(4000);
if (pr.Status != IPStatus.Success)
{
isconn = false;
}
if (tokenSource.Token.IsCancellationRequested)
{
isconn = false;
}
this.Invoke(new Action(() =>
{
this.errorMessage.Visibility = Visibility.Hidden;
this.message.Visibility = Visibility.Hidden;
this.errorMessage.Visibility = Visibility.Hidden;
this.btnOnOff.IsEnabled = true;
this.cmbSerialPort.IsEnabled = true;
tokenSource.Cancel();
}));
return isconn;
}
catch (Exception ex)
{
isconn = false;
}
return isconn;
}, tokenSource.Token);
tasks[1] = Task.Run(() =>
{
timer.Interval = new TimeSpan(0, 0, 0, 1);
timer.Tick += (s, oe) =>
{
Seconds--;
if (Seconds < 0)
{
timer.Stop();
Seconds = 6;
this.lberrormessage.Content = "服务器连接失败";
return;
}
ShowTime();
if (tokenSource.Token.IsCancellationRequested)
{
timer.Stop();
Seconds = 6;
return;
}
lberrormessage.Content = "正在连接服务器......" + Seconds;
if (Seconds < 0)
{
lberrormessage.Content = "服务器连接失败!";
timer.Stop();
Seconds = 6;
tokenSource.Cancel();
}
};
//timer.Start();
//isconn = false;
//Seconds = 6;
}, tokenSource.Token);
代码中定义了两个task,这两个task的结果是互相影响的。如果task1返回为true,则task2停止执行。如果task2返回为true,则task1停止。另外一定要注意task1和task2的先后顺序,这个就要看具体的需求而定了。总之,代码实现了两个task之间的通信。task的运行结果,影响task之间的执行。
注:我这是在TabControl中编写的应用,发现首次登陆的时候可以成功执行,但是在不同tab之间切换之后就不能正确的执行了。现在也不知道为啥!有高手遇到过吗?跪求解答。
task CancellationTokenSource的更多相关文章
- Task CancellationTokenSource和Task.WhenAll的应用
Task是.net4.0推出的异步编程类,与ThreadPool.QueneUserWorkItem方法类似的是,Task也是使用线程池来工作的.但Task比起这个QueneUserWorkItem的 ...
- 创建CancellationTokenSource对象用于取消Task
虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章 ...
- 线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource
不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程.对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦 ...
- 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换
经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...
- .NET 4.0 任务(Task)
随着 .NET 4.0的到来,她与以前各版本的一个明显差别就是并行功能的增强,以此来适应这个多核的世界.于是引入了一个新概念---任务,作为支持并行运算的重要组成部分,同时,也作为对线程池的一个补充和 ...
- 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换
[源码下载] 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 作者:webabcd 介绍 ...
- .net task
Task 是4.0里面带来的一个很好用的线程类,后台也是由线程池控制的 有时间是里面的方法得好好看看. 今天学到一个新的. 当需要两个操作并行执行,然后再线性执行时.可以先 Task1 Task2执行 ...
- C# WebApi+Task+WebSocket实战项目演练(四)
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
- C#异步Task编程模型实战手册
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...
随机推荐
- C# 执行oracle sql 语句出现中文不兼容的问题
最近我用C#调用 操作oracle 数据库 出现了一个问题就是 我的查询语中的条件语句 含有中文 字符在C#中查询不了 ,但是在pl sql 中能够正常的查询出来. 这个原因是 C# 执行orccl ...
- 16、使用limit offset 分页时,为什么越往后翻越慢?如何解决?
在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦. 当一个表数据有几百万的数据的时候成了问题! 如 * f ...
- ES7 and ES8 特性
ES7 特性:1.Array.prototype.includes let arr = ['react', 'angular', 'vue'] // Correct if (arr.includes( ...
- if判断中的true和false
真值指的是在 布尔值 上下文中转换后(使用强制类型转换)的值为真的值.所有值都是真值,除非它们被定义为 falsy (即除了 false,0,"",null,undefined 和 ...
- 410 for 循环 运算 改变循环的控制流 死循环 遍历数组 定义方法 有名函数匿名函数 定义函数的方法取值 date math 局部变量 函数 局部与全局变量 次幂/随机数/取绝对值/向上取整/平方根
for(1.表达式1;2.表达式2;3.表达式3){ 4.循环体语句; } 先执行1 ,在执行2, 表达式, 如果2结果为false,退出循环 如果2是true 执行4 在执行3 执行2 举例打印1- ...
- webpack4之踩坑总结
一.先放上项目目录结构 二.问题总结 1.关于process.env.NODE_ENV问题 刚开始的时候,我想在配置文件中使用到这个环境变量,却发现一直获取不到值,晕晕晕,查了资料才知道,这个环境变量 ...
- JS媒体查询
样式的改变使用C3的媒体查询 行为和功能的改变使用JS的媒体查询 matchMedia()方法参数可写任何一个CSS@media规则,返回的是新的MediaQueryList对象,该对象有两个属性 m ...
- 命令制作Mac系统U盘启动
命令 sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Vol ...
- Python开发【第十篇】:模块
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- ios中safari无痕浏览模式下,localStorage的支持情况
前言 前阶段,测试提了个bug,在苹果手机中无痕模式下,搜索按钮不好使,无法跳页,同时搜索历史也没有展示(用户搜索历史时使用localStorage存储). 正文 iOS上Sarfari在无痕模式下, ...