zoukankan      html  css  js  c++  java
  • C#中的Task.WhenAll()和Task.WaitAll()有什么区别

    转自https://www.nhooo.com/note/qa02fb.html

    Task.WaitAll阻止当前线程,直到所有其他任务完成执行为止。Task.WhenAll方法用于创建仅当所有其他任务均已完成时才完成的任务。

    如果我们使用Task.WhenAll,我们将得到一个未完成的任务对象。但是,它不会阻塞,但会允许程序执行。相反,Task.WaitAll方法调用实际上会阻塞并等待所有其他任务完成。

    为了举例说明,让我们说我们有一个任务,它使用UI线程执行一些活动,例如需要在用户界面中显示一些动画。现在,如果我们使用Task.WaitAll,则在所有相关任务完成并释放该块之前,该用户界面将被阻止并且不会更新。但是,如果我们在同一应用程序中使用Task.WhenAll,则不会阻塞UI线程,而是会照常更新。

    Task.WhenAll的示例-

    示例

    using System;
    using System.Threading.Tasks;
    namespace DemoApplication{
       public class Program{
          static void Main(string[] args){
             Task task1 = new Task(() =>{
                for (int i = 0; i < 5; i++){
                   Console.WriteLine("Task 1 - iteration {0}", i);
                   Task.Delay(1000);
                }
                Console.WriteLine("Task 1 complete");
             });
             Task task2 = new Task(() =>{
                Console.WriteLine("Task 2 complete");
             });
             task1.Start();
             task2.Start();
             Console.WriteLine("等待任务完成。");
             Task.WhenAll(task1, task2);
             Console.WriteLine("任务完成。");
             Console.ReadLine();
          }
       }
    }

    输出结果

    上面代码的输出是

    等待任务完成。
    任务完成。
    Task 1 - iteration 0
    Task 2 complete
    Task 1 - iteration 1
    Task 1 - iteration 2
    Task 1 - iteration 3
    Task 1 - iteration 4
    Task 1 complete

    在上面的示例中,我们可以看到在使用Task.WhenAll时,在其他任务完成之前执行了complete任务。这意味着Task.WhenAll不会阻止执行。

    Task.WaitAll的示例-

    示例

    using System;
    using System.Threading.Tasks;
    namespace DemoApplication{
       public class Program{
          static void Main(string[] args){
             Task task1 = new Task(() =>{
                for (int i = 0; i < 5; i++){
                   Console.WriteLine("Task 1 - iteration {0}", i);
                   Task.Delay(1000);
                }
                Console.WriteLine("Task 1 complete");
             });
             Task task2 = new Task(() =>{
                Console.WriteLine("Task 2 complete");
             });
             task1.Start();
             task2.Start();
             Console.WriteLine("等待任务完成。");
             Task.WaitAll(task1, task2);
             Console.WriteLine("任务完成。");
             Console.ReadLine();
          }
       }
    }

    输出结果

    上面代码的输出是

    等待任务完成。
    Task 1 - iteration 0
    Task 2 complete
    Task 1 - iteration 1
    Task 1 - iteration 2
    Task 1 - iteration 3
    Task 1 - iteration 4
    Task 1 complete
    任务完成。

    在上面的示例中,我们可以看到,使用Task.WaitAll时,仅在所有其他任务完成后才执行完成任务。这意味着Task.WaitAll阻止执行。

  • 相关阅读:
    Brain network involved in autonomic functions 与自主功能相关的大脑网络
    Brief summary of classical components of ERP 事件相关成分(ERP)经典成分小结
    ICA & Percentage Variance Account For (PVAF)
    数据处理中白化Whitening的作用图解分析
    Loadings vs eigenvectors in PCA 主成分分析(PCA)中的负荷和特征向量
    主成分分析(PCA)和独立成分分析(ICA)相关资料
    Sketch of heart and QRS complex 心脏及QRS波群简图
    Brain Network visulation in EEG 脑电网络可视化
    Phase Locking Value (PLV) 神经信号的锁相值
    ubuntu16.04下的一些基本操作笔记
  • 原文地址:https://www.cnblogs.com/icejd/p/14911039.html
Copyright © 2011-2022 走看看