1.启动任务

  1. //Framework4.5新增的Task.Run开启一个任务,Run方法中传入一个Action委托
  2. Task.Run(()=> { Thread.Sleep(); Console.WriteLine("hello1"); });
  3. Console.WriteLine("abc1");
  4.  
  5. //Task.Run == Task.Factory.StartNew,后者4.0就可以使用
  6. Task.Factory.StartNew(() => { Thread.Sleep(); Console.WriteLine("hello2"); });
  7. Console.WriteLine("abc2");
  8. Console.ReadLine();

Task默认使用线程池中的线程(线程池中的线程为后台线程)。

Task.run()返回一个Task对象,用于监控任务的执行过程。Status属性追踪执行状态

2.等待任务

  1. Task task= Task.Run(()=> { Thread.Sleep(); Console.WriteLine("hello1"); });
  2. Console.WriteLine("abc1");
  3. //等待里面task任务结束当前线程再后向下执行,相当于Thread.join()
  4. task.Wait();
  5. Console.WriteLine("abc2");
  6. Console.ReadLine();

3.返回值

Task的子类 Task<> 允许任务返回一个值,

  1. Task<string> task = Task.Run(()=>{ Thread.Sleep(); return ""; });
  2. Console.WriteLine("a");
  3. //阻塞
  4. string str = task.Result;
  5. Console.WriteLine(str);
  6. Console.WriteLine("b");
  7. Console.ReadLine();

task.Result为返回结果。如果当前任务没执行完毕则调用该属性会阻塞当前线程。

4.异常

用release调试,为什么暂时不知道....

  1. static void Main(string[] args)
  2. {
  3. Task task = Task.Run(() => throw new Exception("异常"));
  4. try
  5. {
  6. task.Wait();
  7. }
  8. catch (Exception e)
  9. {
  10. Console.WriteLine(e.Message);
  11. }
  12. Console.ReadLine();
  13. }

5.延迟

方法一、

  1. static void Main(string[] args)
  2. {
  3. Task<int> task = Task.Run(() => { Thread.Sleep(); Console.WriteLine(); return ; });
  4. Console.WriteLine();
  5. var awaiter = task.GetAwaiter();
  6. Console.WriteLine();
  7. awaiter.OnCompleted(() =>
  8. {
  9. int result = awaiter.GetResult();
  10. Console.WriteLine(result);
  11. });
  12. Console.WriteLine();
  13. Console.ReadLine();
  14. }
  1. awaiter.OnCompleted 表示当上个任务执行完毕时,执行附加的后续任务。
    如果先前的任务出现了错误,可以在awaiter.GetResult()的时候重新抛出异常

4以后会等待几秒再显示1和999,

如果不加Console.ReadLine(); 1和999还没来及显示就结束了

方法二、

  1. Task<int> task = Task.Run(() => { Thread.Sleep(); Console.WriteLine(); return ; });
  2. Console.WriteLine();
  3. task.ContinueWith(antecedent => { int res = antecedent.Result; Console.WriteLine(res); });
  4. Console.WriteLine();
  5. Console.ReadLine();

这种方式会返回一个Task对象,它更加适合添加更多的延续。但是如果任务出现错误,我们必须处理AggregateException.

如果需要将延续奉送到UI应用程序上,还需要额外代码

再非UI上下文,若希望延续任务和先导任务执行在同一个线程上,还需要指定TaskContiuationOptions.ExecuteSynchronously,不然它会去请求线程池

ContinueWith更适合并行编程场景

6.另一种创建任务的方法

7.异步等待

  1. static void Main(string[] args)
  2. {
  3. Program ds = new Program();
  4. Console.WriteLine("");
  5. ds.ShowDealyAsync();
  6. Console.WriteLine("");
  7. Console.Read();
  8. }
  9.  
  10. public async void ShowDealyAsync()
  11. {
  12. Console.WriteLine("");
  13. await Task.Delay(); //执行到await表达式时,立即返回到调用方法,等待5秒后执行后续部分
  14. Console.WriteLine("");
  15. }
  1. 执行到await Task.Delay(5000);时形成分叉路,一方面立即跳回到调用它的方法继续向下执行,同时当前方法等待5秒后向下执行,相当于一个异步版Thread.sheep

显示222一段时间后显示444

异步 lambda表达式

  1. static async Task Main(string[] args)
  2. {
  3. Func<Task> func = async () => { await Task.Delay(); Console.WriteLine("Foo"); };
  4. await func();
  5. Console.WriteLine("abc");
  6. Console.ReadKey();
  7. }

添加到事件的异步

  1. myButton.Click+= async (sender, args) =>
  2. {
  3. await Task.Delay();
  4. ....
  5. }

(65)C# 任务的更多相关文章

  1. STM32 KEIL不能输入仿真引脚端口error 65: access violation at 0x40021000 : no 'read' permission

    使用MDK自己创建一个STM32F103ZE核的项目 加入源码后编译,正常,在线仿真单步执行出现如下问题 error 65: access violation at 0x40021000 : no ' ...

  2. Linux Kernel 3.11.4/3.10.15/3.4.65/3.0.99

    Linux 今天又发布了4个更新版本,分别是: 3.11.4 2013-10-05 [tar.xz] [pgp] [patch] [view patch] [view inc] [cgit] [cha ...

  3. 65行 JavaScript 代码实现 Flappy Bird 游戏

    飞扬的小鸟(Flappy Bird)无疑是2014年全世界最受关注的一款游戏.这款游戏是一位来自越南河内的独立游戏开发者阮哈东开发,形式简易但难度极高的休闲游戏,很容易让人上瘾. 这里给大家分享一篇这 ...

  4. NYOJ题目65另一种阶乘问题

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsIAAAJhCAIAAADE+EHOAAAgAElEQVR4nO3drXLjSAMu4HMT4bmQYF

  5. Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  6. Bestcoder round #65 && hdu 5592 ZYB's Premutation 线段树

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  7. Scala 深入浅出实战经典 第65讲:Scala中隐式转换内幕揭秘、最佳实践及其在Spark中的应用源码解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  8. 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制

    [源码下载] 重新想象 Windows 8 Store Apps (65) - 后台任务: 音乐的后台播放和控制 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台 ...

  9. Java Axis2 1.6.3+JDK1.7.0_13+Tomcat7.0.65+eclipse搭建web service

    安装文件下载: jdk1.7.0_13 安装步骤参考文章:http://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html tomcat7. ...

  10. paper 65 :尺度不变特征变换匹配算法[转载]

    尺度不变特征变换匹配算法 对于初学者,从David G.Lowe的论文到实现,有许多鸿沟,本文帮你跨越.1.SIFT综述 尺度不变特征转换(Scale-invariant feature transf ...

随机推荐

  1. WildFly的学习

    1. WildFly介绍: WildFly,前身是JBoss AS,从V8开始为区别于JBoss EAP,更名为WildFly. 由红帽 (Red Hat)开发,是另一个功能齐全且经过认证的应用服务器 ...

  2. Mac011--DbWrench Database安装

    Mac--DbWrench Database安装 DbWrench <=> powerdesigner 下载网址:http://dbwrench.com/download/install/ ...

  3. git报错-Initial commit Untracked files nothing added to commit but untracked ……

    文章转自 https://www.jianshu.com/p/61c3db30d488 在目标执行命令 git stratus 报错 根据上面的文章,可以解决问题.不行的话,请留言. 感谢你的阅读

  4. [Linux] 021 RPM 包的安装、升级与卸载

    1. 包全名与包名包全名 包全名:操作的包是没有安装的软件包 使用包全名.而且要注意路径包名 包名:操作已经安装的软件包时,使用 是搜索 /var/lib/rpm/ 中的数 2. 安装 $ rpm - ...

  5. mybatis插件机制及分页插件原理

    MyBatis 插件原理与自定义插件: MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式 ...

  6. Quartz-第二篇 使用quartz框架定时推送邮件

    1.定时推送邮件,也就是使用定时调度框架触发我们的发邮件动作,发邮件动作,请参考我的这篇随笔.

  7. go 学习之io/ioutil包

    // Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情// 并且始终成功返回.var Discard io.Writer = devNull(0) // Re ...

  8. JavaScript —— 字符串中使用正则表达式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Spring Cloud Contract简介

    转载:https://www.jianshu.com/p/e3277824a10a 和dummy service一样 Spring Cloud Contract是个啥? Spring Cloud Co ...

  10. SpringIntegration---MongDB

    1.依赖 <dependency> <groupId>org.springframework.integration</groupId> <artifactI ...