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 是一样的,任意一个完成就执行后面代码

  • 相关阅读:
    tomcat 服务器的几个重要监听 方法 与 使用
    webSocket 前端 js 加入 心跳机制 的基本写法
    Palinwords (处理回文串)
    Anti-Rhyme Pairs (求最长公共前缀)
    Extend to Palindrome (顺序Hash和逆序Hash处理回文)
    Milk Patterns (hash + 二分)
    次小生成树
    Borg Maze (BFS预处理+最小生成树)
    P1126 机器人搬重物
    P1141 01迷宫 (记忆化搜索)
  • 原文地址:https://www.cnblogs.com/yanglang/p/9602187.html
Copyright © 2011-2022 走看看