zoukankan      html  css  js  c++  java
  • WaitAll 和 WhenAll 的使用及区别

    用过.net 异步编程的同学都知道,比以前的多线程编程实现起来真的方便很多,今天把WaitAll和WhenAll这两种编程方式回顾总结一下(当然WaitAny、WhenAny是一样的操作)

    1:WaitAll

    这个方法在我理解看来,主要是为了解决多个不太相关的操作同步执行的话,耗时较多,这个方法可以使得他们异步同时执行,然后当所有操作都完成以后,再去进行接下来的操作,talk is cheap,show you code!

    举个例子:

     1                 var response1 = new PriceDataResponse();
     2                 var response2 = new PriceDataResponse();
     3 
     4                 //定义两个异步任务 task1,task2
     5                 Task task1 = Task.Factory.StartNew(() =>
     6                 {
     7                     response1 = SampleFunc(1);
     8                 });
     9 
    10                 Task task2 = Task.Factory.StartNew(() =>
    11                 {
    12                         response2 =  SampleFunc(2);
    13                 });
    14 
    15                 //等待两个任务执行完成(同时执行)
    16                 Task.WaitAll(task1, task2);
    17 
    18                 //执行完以后,再进行以下操作
    19                 if (response1.Prices.Any())
    20                 {
    21                     return response1;
    22                 }
    23                 if (response2.Prices.Any())
    24                 {
    25                     return response2;
    26                 }

    也就是说,task1 和  task2 两个任务在定义之后就已经马不停蹄的在子线程中运行了,Task.WaitAll 是一个等待的过程,参数就是Task参数,一旦全部执行完毕了,就继续往下执行,这里是阻塞的,还是比较好理解的。

    这样的话WaitAny就很好理解了,就是参数里面的Task 有任意一个执行完成,就继续执行后面的逻辑

    2:WhenAll

    WhenAll其实跟WaitAll是为了实现一样的功能,只是在WaitAll基础上又做了一层包装,看代码就明白了

     1 var response1 = new PriceDataResponse();
     2                 var response2 = new PriceDataResponse();
     3 
     4                 //定义两个异步任务 task1,task2
     5                 Task task1 = Task.Factory.StartNew(() =>
     6                 {
     7                     response1 = SampleFunc(1);
     8                 });
     9 
    10                 Task task2 = Task.Factory.StartNew(() =>
    11                 {
    12                     response2 = SampleFunc(2);
    13                 });
    14 
    15                 //等待两个任务执行完成(同时执行)
    16              
    17                 Task.WhenAll(task1, task2).ContinueWith(p =>
    18                 {
    19                     if (response1.Prices.Any())
    20                     {
    21                         return response1;
    22                     }
    23                     if (response2.Prices.Any())
    24                     {
    25                         return response2;
    26                     }
    27                     return null;
    28                 }, TaskContinuationOptions.OnlyOnRanToCompletion);

    功能上与WaitAll 是一样,意思就是在两个异步结束了以后,再继续做 ContinueWith 里面的处理这里的 p 相当于是Task,如果前面定义的Task有返回值,那么这里可以用p.Result来取值

    WhenAny 是一样的,任意一个完成就执行后面代码

  • 相关阅读:
    每日一水 POJ8道水题
    编译和使用 MySQL C++ Connector
    j2ee model1模型完成分页逻辑的实现 详解!
    DB查询分析器访问EXCEL时,要在表名前后加上中括弧或双引号
    指向结构体变量的指针
    EOSS V3.0 企业运营支撑系统(基于RBAC原理的权限管理)
    MybatisGen1.0 Mybatis JavaBean Mapper生成工具
    The table name must be enclosed in double quotation marks or sqare bracket while accessing EXCEL by
    资源-Android:Android
    软件-开发软件:Android Studio
  • 原文地址:https://www.cnblogs.com/yanglang/p/9602187.html
Copyright © 2011-2022 走看看