使用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的更多相关文章

  1. Task CancellationTokenSource和Task.WhenAll的应用

    Task是.net4.0推出的异步编程类,与ThreadPool.QueneUserWorkItem方法类似的是,Task也是使用线程池来工作的.但Task比起这个QueneUserWorkItem的 ...

  2. 创建CancellationTokenSource对象用于取消Task

    虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章 ...

  3. 线程阶段性总结——APM,ThreadPool,Task,TaskScheduler ,CancellationTokenSource

    不管我们使用thread,threadPool,task,还是APM异步,本质都是在使用多线程.对于新手来说,不太敢用多线程的原因,就我个人的体验来说,就是对多线程的异常捕获方式或时机缺乏了解,而一旦 ...

  4. 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    经典的异步编程模型(IAsyncResult) 最新的异步编程模型(async 和 await) 将 IAsyncInfo 转换成 Task 将 Task 转换成 IAsyncInfo 示例1.使用经 ...

  5. .NET 4.0 任务(Task)

    随着 .NET 4.0的到来,她与以前各版本的一个明显差别就是并行功能的增强,以此来适应这个多核的世界.于是引入了一个新概念---任务,作为支持并行运算的重要组成部分,同时,也作为对线程池的一个补充和 ...

  6. 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换

    [源码下载] 重新想象 Windows 8 Store Apps (44) - 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换 作者:webabcd 介绍 ...

  7. .net task

    Task 是4.0里面带来的一个很好用的线程类,后台也是由线程池控制的 有时间是里面的方法得好好看看. 今天学到一个新的. 当需要两个操作并行执行,然后再线性执行时.可以先 Task1 Task2执行 ...

  8. C# WebApi+Task+WebSocket实战项目演练(四)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第四部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  9. C#异步Task编程模型实战手册

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

随机推荐

  1. eclipse下classes文件夹无法发布到tomcat的问题--tomcat发布慢的问题

    === 解决eclipse下classes文件夹无法发布到tomcat的问题_Nautilus_新浪博客http://blog.sina.com.cn/s/blog_484d8777010130n5. ...

  2. 让你爱不释手的 Python 模块

     一. logzero 在一个完整的信息系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为.我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些 ...

  3. GitHub界面初识

      现在很多 HR 在招聘程序员的需求都会提到「有 Github 项目者优先」,大部分求职者也会在简历中附上 Github 链接. 作为一个专业的 HR,即便不懂代码,也不能被一个链接唬住.今天我就手 ...

  4. sed追加文本-sed脚本追加文本

    input为sed输入文件,内容如下: [root@node1 gitlab-test-]# cat inppu.txt aa bb cc dd 追加文本: 1.匹配  aa 行之后追加文本 We a ...

  5. git提交忽略某些文件或文件夹

    记得第一次用 github 提交代码,node_modules 目录死活传不上去,哈哈哈,后来才知道在 .gitignore 文件里设置了忽略 node_modules 目录上传.是的, .gitig ...

  6. Linux什么是挂载?mount的用处在哪?

    关于挂载的作用一直不是很清楚,今天在阅读教材时看见了mount这个命令,发现它的用处很隐晦但非常强大.奈何教材说的不明朗,因此在网上整合了一些优秀的解释,看完之后豁然开朗. 1.提一句Windows下 ...

  7. Django—入门

    索引 1.搭建环境 2.创建项目 3.设计模型 4.管理站点 5.视图及URL 6.模板 软件框架 问题1:什么是软件框架? 举个简单的例子,对于一个公司来说,公司中有各个职能部门,每个部门各司其职, ...

  8. spring官网上下载历史版本的spring插件,springsource-tool-suite

    spring官网下载地址(https://spring.io/tools/sts/all),历史版本地址(https://spring.io/tools/sts/legacy). 注:历史版本下载的都 ...

  9. python之鼠标的操作

    鼠标操作的方法,封装在ActionChains类中 perform:执行ActionChains中的所有存储行为 context_click:右键单击 move_to_element:悬停 doubl ...

  10. elasticsearch-5.2.1在windows下的安装方法

    elasticsearch-5.2.1安装方法 1. 安装java 下载安装java jdk 1.8 以上 配置java环境变量 右击[我的电脑]---[属性]-----[高级系统设置]---[环境变 ...