C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のTask.WhenAll()とTask.WaitAll()の違いは何ですか?


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("Waiting for tasks to complete.");
         Task.WhenAll(task1, task2);
         Console.WriteLine("Tasks Completed.");
         Console.ReadLine();
      }
   }
}

出力

上記のコードの出力は

です。
Waiting for tasks to complete.
Tasks Completed.
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を使用すると、他のタスクが完了する前にすべてのタスクが完了したことがわかります。これは、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("Waiting for tasks to complete.");
         Task.WaitAll(task1, task2);
         Console.WriteLine("Tasks Completed.");
         Console.ReadLine();
      }
   }
}

出力

上記のコードの出力は

です。
Waiting for tasks to complete.
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
Tasks Completed.

上記の例では、Task.WaitAllを使用すると、他のすべてのタスクが完了した後にのみタスクcompleteが実行されることがわかります。これは、Task.WaitAllが実行をブロックすることを意味します。


  1. DirectX11とDirectX12の違いは何ですか?

    DirectXは、マルチメディアコンテンツをレンダリングし、グラフィカルハードウェアと通信するためにソフトウェアによって使用されるAPIまたはアプリケーションプログラミングインターフェイスのコレクションです。 DirectXの主要コンポーネントAPIであるDirect3Dは、ソフトウェアとグラフィックスハードウェア間の通信を処理します。すべてのハードウェアが異なるため、関数と呼び出しの標準化されたライブラリを使用してグラフィックカードと通信すると、ゲーム開発がスピードアップします。これはハードウェアアブストラクションと呼ばれ、APIの主な仕事です。 車について考えてみましょう。1台の車を運転

  2. C#のリストと配列の違いは何ですか?

    配列は同じタイプの要素の固定サイズのシーケンシャルコレクションを格納しますが、リストはジェネリックコレクションです。 リストを定義するには- List<string7gt; myList = new List<string>(); リストに要素を設定するには、Addメソッド-を使用する必要があります myList.Add("Audi"); myList.Add("BMW"); myList.Add("Chevrolet"); myList.Add("Hyundai"); 配列を定義するには-