引言: 最近经常想到一句话“纸上得来终觉浅”,不知道有没有朋友有相似的感觉,如果要的话我想应该就要努力充电了。因为在做东西的时候,要用到异步加载数据,具体功能也就是当加载数据的时候,创建线程异步加载数据,加载完数据后通知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. MySQL下创建序列及创建自定义函数方法介绍

    工作过程中需要将基于DB2数据库的应用以及数据迁移到MySQL中去,在原应用中,大量使用了SEQUENCE,考虑尽量减少代码的修改,决定在迁移后的应用中继续保留SEQUENCE的使用,这就要求在MyS ...

  2. SDK代码记录

    zynq中SDK相关API的学习.记录常用函数 /*************************************************************************** ...

  3. 持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型

    持久化的基于L2正则化和平均滑动模型的MNIST手写数字识别模型 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tens ...

  4. [LeetCode] 31. Next Permutation ☆☆☆

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  5. mysql \G

    mysql 命令区分大小写.ego       (\G) Send command to mysql server, display result vertically. go        (\g) ...

  6. Global Vectors forWord Representation

    参考论文: GloVe: Global Vectors forWord Representation 参考博客:https://blog.csdn.net/coderTC/article/detail ...

  7. TabLayout 使用方法 (基础)

    此为布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:a ...

  8. TCP和UDP相关概念

    位于传输层的协议,都是基于IP协议的. TCP是面向连接的.可靠的传输,UDP是无连接的.不可靠的传输.要进行TCp传输时候,需要进行三次握手,建立连接,然后才能发送数据,而且在发送过程中,有数据的确 ...

  9. web开发之Servlet 二

    在上一篇文章中,我们演示也证明了Servlet 是一种动态web资源开发的技术,即我可以在浏览器中输入URL,然后就可以在浏览器中看到我们编写的Servlet资源. 那当我们在浏览器上一起一个HTTP ...

  10. asp.net实现access数据库分页

    最近在编程人生上看到篇文章很有感触,觉得人生还是要多奋斗.今天给大家贡献点干货. <divclass="page"id="ctrlRecordPage"& ...