C#Task를 사용하여 비동기식 작업을 수행하는 방법

Task 를 사용하는 이유


루틴은 창설과 발송의 밑바닥 도구이기 때문에 일정한 한계가 있다.
  • 연합(Join) 라인에서'되돌아오는 값'을 얻을 수 있는 간단한 방법은 없다.따라서 공유 영역을 만들어야 합니다.이상을 던졌을 때, 이상을 포착하고 처리하는 것도 번거로워.
  • 라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다).
  • 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이다.스레드 풀을 사용하여 부팅 지연을 줄일 수 있으며, TaskCompletionSource를 통해 리셋 방법을 사용하여 여러 스레드가 입출력 집약적인 작업을 동시에 기다리지 않도록 할 수 있습니다.

    Task 및 Thread 차이점


    1. 임무는 라인 위에 구축된 것이다. 즉, 임무는 결국 라인에 던져서 집행해야 한다는 것이다.
    2. 임무와 라인은 일대일의 관계가 아니다. 예를 들어 10개의 임무를 열면 10개의 라인을 열 수 있다는 것이 아니다. 이 임무는 약간 라인 탱크와 유사하지만 임무는 라인 탱크에 비해 매우 적은 비용과 정확한 제어를 가진다.
    Task 는 Thread 와 마찬가지로 System 에 있습니다.Threading 네임스페이스 아래
    라인에 비해Task는 더욱 고급스러운 추상적인 개념으로 라인을 통과하거나 통과하지 않는 병행 조작을 표시한다.

    Task 소개


    Task 클래스는 단일 작업이 값을 반환하지 않고 비동기적으로 실행된다는 것을 나타냅니다.Task 대상은 하나의 중심 사상이 임무를 바탕으로 하는 비동기 모델을 처음으로 도입한 것이다.NET Framework 4에서작업 수행 Task 대상이 주 응용 프로그램의 동기화 방식이 아니라 비동기적으로 온라인 스레드를 실행하기 때문에, Status 속성과 IsCanceled,, IsCompleted, IsFaulted 속성을 사용하여 작업의 상태를 확인할 수 있습니다.대부분의 경우, lambda 표현식은 지정된 임무를 수행하는 데 사용됩니다.

    Task 단순화


    Task의 구조 함수를 사용하여 작업을 만들고 Start 방법을 호출하여 작업을 시작하고 비동기식으로 작업을 수행합니다.
    
    static void Main(string[] args)
    {
            Console.WriteLine(" .");
            // 
            Task task = new Task(() => {
                Console.WriteLine(" System.Threading.Tasks.Task .");
                for (int i = 0; i < 10; i++)
                {
                      Console.WriteLine(i);
                }
          });
         // , 
          task.Start();
          Console.WriteLine(" ");
    }
    Framework 4.5부터 백그라운드 라인으로 이루어진 Task를 시작하고 정적 방법인 Task를 사용할 수 있습니다.Run
    
    Task task = Task.Run(() =>
        {
            Thread.Sleep(2000);
            Console.WriteLine("Foo");
        });
    Task는 기본적으로 스레드 탱크를 사용합니다. 모두 백그라운드 스레드입니다.주 라인이 끝날 때 모든 작업이 멈추는 것을 의미합니다.

    Task 실행 상태


    1. 대기(Wait)


    Wait 메서드를 사용하면 작업이 완료될 때까지 작업을 막을 수 있으며 효과는 Thread와 같습니다.Join:
    
    Task task = Task.Run(() =>
        {
            Thread.Sleep(2000);
            Console.WriteLine("Foo");
        });
        Console.WriteLine(task.IsCompleted); //False
        task.Wait();// , 
        Console.WriteLine(task.IsCompleted); //True
        Console.ReadLine();

    2. 반환값


    Task를 사용하면 작업이 값을 반환할 수 있습니다.Task를 호출합니다.Run, Action 대신 Func 에이전트(또는 호환되는 Lambda 표현식)를 전송하면 Task:
    
    Task<int> task = Task.Run (() => { Console.WriteLine ("Foo"); return 3; });
    
    int result = task.Result;      // Blocks if not already finished
    Console.WriteLine (result);    // 3
    다음 예제에서는 LINQ를 사용하여 처음 3백만 개의 정수(2부터 시작)의 소수에 따라 작업을 만듭니다.
    
    Task<int> primeNumberTask = Task.Run(() =>
            Enumerable.Range(2, 3000000).Count(n => Enumerable.Range(2, (int)Math.Sqrt(n) - 1).All(i => n % i > 0)));
    
        Console.WriteLine("Task running...");
        Console.WriteLine("The answer is " + primeNumberTask.Result);
    이 코드는 "Task running..."을 인쇄합니다.그리고 몇 초 후에 216815를 인쇄합니다.

    3. Task.Delay


    Task.Delay는 Thread입니다.Sleep의 비동기식 버전
    
    Task.Delay(5000).GetAwaiter().OnCompleted(()=>Console.WriteLine(42));
    혹은
    
    Task.Delay(5000).ContinueWith(ant => Console.WriteLine(42));
    이상은 C#에서 Task를 사용하여 비동기적인 조작을 수행하는 방법에 대한 상세한 내용입니다. c#에서 Task로 비동기적인 조작을 수행하는 것에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기