引言: 最近经常想到一句话“纸上得来终觉浅”,不知道有没有朋友有相似的感觉,如果要的话我想应该就要努力充电了。因为在做东西的时候,要用到异步加载数据,具体功能也就是当加载数据的时候,创建线程异步加载数据,加载完数据后通知UI,关掉页面加载动画。在查MSDN的时候就看到了延时任务这个名词,于是就试验了一下,果然,用一次就知道是想要的。

名词解释:

  在异步编程中,一个异步操作在完成时调用另一个操作并将数据传递到其中的情况非常常见。 传统上,此过程是通过使用回调方法完成的。 在任务并行库中,“延续任务”提供了同样的功能。 延续任务(也简称为“延续”)是一个异步任务,由另一个任务(称为前面的任务)在完成时调用。”  

  尽管延续相对容易使用,但也十分强大和灵活。 例如,您可以

  • 将数据从前面的任务传递到延续

  • 指定将调用或不调用延续所依据的精确条件

  • 在延续启动之前取消延续,或在延续正在运行时以协作方式取消延续

  • 提供有关应如何安排延续的提示

  • 从同一前面的任务中调用多个延续

  • 在多个前面的任务中的全部或任一任务完成时调用一个延续

  • 将延续依次相连,形成任意长度

  • 使用延续来处理前面的任务所引发的异常

如何使用

我们来看一下task这个类:表示一个异步任务,实例有两种创建方式:

Task t1 = new Task(new Action(()=>{}), "alpha");

Task t2 = Task.Factory.StartNew(new Action(()=>{}), "beta");

延时任务就是task实例的一个方法,下面我们创建一个异步调用的方法看一下,到底怎么样:

  private void BeginInvoke(Action action, Action<Task> complated)
{ Task task = new Task(action);
if (complated != null)
{
task.ContinueWith(complated);
}
task.Start();
}

先看一下方法内的参数,第一个是一个无参数无返回值的委托,而第二个则是一个有参数无返回值的委托。
这里我是想要在第一个方法执行完后执行第二个方法,于是第一行我们创建了一个Task实例,并给实例指定了一个调用的方法,然后我们就可以用task.ContinueWith(complated)把第二个方法,也可以说成延时任务,因为它会在执行完前一个任务后执行这个任务。并且会把当前任务的引用将以参数的形式传给延时任务,我们看一下如何传递

 private void complated(Task task)
{
if (task.IsCompleted)
//在当前线程获取主线程的UI元素
this.Dispatcher.BeginInvoke(new Action(() => { this.ucLoading.Visibility = Visibility.Collapsed;}));
}
这里方法的参数就是钱一个任务的引用,我们可以判断任务是否执行完毕,执行完毕后我们则执行我们想要的结果,也就是关闭加载动画。

其它

这里可以看到一句代码 this.Dispatcher.BeginInvoke,这是因为在WPF中,DispatcherObject只能通过与它关联的 Dispatcher 进行访问。 例如,后台线程不能更新与 UI 线程中的 Dispatcher 关联的Button内容。 为了使该后台线程能够访问Button的Content属性,该后台线程必须将此工作委托给与该 UI 线程关联的 Dispatcher。 这可以通过使用Invoke或 BeginInvoke 来完成。Invoke 是同步操作,而 BeginInvoke 是异步操作。

该操作将按指定的DispatherPriority添加到Dispather的队列中,我么知道DispatcherObject是一个很底层的类,很多类都继承自这个类,比如Button等,那么我们想要在UI线程外的线程访问这些UI控件,就要用到Dispather这个类,用它与UI线程交互。

    

TPL之延续任务的更多相关文章

  1. 细说并发编程-TPL

    本节导航 基本概念 并发编程 TPL 线程基础 windows为什么要支持线程 线程开销 CPU的发展 使用线程的理由 如何写一个简单Parallel.For循环 数据并行 Parallel.For剖 ...

  2. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  3. 并发编程-TPL

    并发编程-TPL 本节导航 基本概念 并发编程 TPL 线程基础 windows为什么要支持线程 线程开销 CPU的发展 使用线程的理由 如何写一个简单Parallel.For循环 数据并行 Para ...

  4. Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别

    Task C# 多线程和异步模型 TPL模型   Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...

  5. C#使用任务并行库(TPL)

    TPL(Task Parallel Library) 任务并行库 (TPL) 是 System.Threading和 System.Threading.Tasks 命名空间中的一组公共类型和 API. ...

  6. .NET的并发编程(TPL编程)是什么?

    写在前面 优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版 .NET 中 ...

  7. 移动信息化不能延续PC时代的痛

    当下,随着移动时代的到来,手机功能逐步完善,各个行业针对这一现象纷纷制定了相应的营销计划,于是霎时间兴起了一股网上订票/网上订饭/网上预约的热潮. 而对于IT行业,成为企业信息化最火的代名词莫过于移动 ...

  8. 今天再给大家带点html5前端开发的干货模板“text/tpl”怎么用 script template怎么用

    text/tpl 顾名思义就是模板,其实和C++模板函数类似的作用,就是利用他生成一个HMTL内容,然后append或者替换html里面 有什么好处,假如后端返回来的数据都是一样的,但是需要生成不同的 ...

  9. 发布一个开源极致的javascript模板引擎tpl.js

    tpl.js(大家直接去https://git.oschina.net/tianqiq/tpl.js这个上面看) 简介 tpl.js是一个比较极致(极小,极快,极简单)的js模板引擎,可以在各种js环 ...

随机推荐

  1. IOS性能调优系列:使用Time Profiler发现性能瓶颈

    硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开 ...

  2. 查看MySQL日志数据binlog文件

    binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变. 改变数据库的SQL语句执行结束时,将在binlog的末尾写入一条记录,同时通知语句解析器,语句执行完毕. binlog格式 ...

  3. 51nod 1629 B君的圆锥

    1629 B君的圆锥 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 B君要用一个表面积为S的圆锥将白山云包起来.   B君希望包住的白山云体积尽量 ...

  4. 洛谷P1124 文件压缩

    https://www.luogu.org/problem/show?pid=1124 题目背景 提高文件的压缩率一直是人们追求的目标.近几年有人提出了这样一种算法,它虽然只是单纯地对文件进行重排,本 ...

  5. 【leetcode 简单】第十一题 搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...

  6. Metasploit 一些重要模块使用介绍

    本文是"T00LS Metasploit(第一季)"的文档版,是个人在观看视频动手操作的一个记录,仅供学习.文中会介绍Metasploit的一些基本使用:端口扫描.smb扫描.服务 ...

  7. 郑轻校赛 2127 tmk射气球 (数学)

    Description 有一天TMK在做一个飞艇环游世界,突然他发现有一个气球匀速沿直线飘过,tmk想起了他飞艇上有一把弓,他打算拿弓去射气球,为了提高射击的准确性,他首先在飞艇上找到一个离气球最近的 ...

  8. NYOJ 814 又见拦截导弹 (模拟)

    题目链接 描述 大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以 ...

  9. mysql跨节点join——federated引擎

    一. 什么是federated引擎 mysql中的federated类似于oracle中的dblink. federated是一个专门针对远程数据库的实现,一般情况下在本地数据库中建表会在数据库目录中 ...

  10. Sublime之插件的安装(三)

    今天在写js的时候,突然想到一个问题就是能不能快速的对齐的插件,当当当~~~sublime这么神器当然有,那就是:Alignment插件 如果你写的代码是这样的: var a = , b =, ccc ...