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을 사용할 때 작업 완료는 다른 모든 작업이 완료된 후에만 실행됨을 알 수 있습니다. 즉, Task.WaitAll이 실행을 차단합니다.