연속 작업이 있을 경우 task를 이용한 시간 절감 방법

만약 a 작업이 끝나면 b작업을 해야하는 경우가 있을 경우 b 작업이 상대적으로 느린 경우 다음과 같은 방법으로 해보세요.

Task 안전한 방법으로 쉽게 처리 할 수 있습니다.


using System;

using System.Collections.Concurrent;

using System.Diagnostics;

using System.Threading.Tasks;


class Program

{

    private static BlockingCollection<string> taskQueue = new BlockingCollection<string>();

    private const int NumberOfBTasks = 3; // B 프로그램 인스턴스 개수

    private static int ACount = 100;


    static async Task Main(string[] args)

    {

        Stopwatch stopwatch = new Stopwatch();

        stopwatch.Start();


        Console.WriteLine("Main started.");

        Console.WriteLine(stopwatch.ElapsedMilliseconds);


        // B Task 인스턴스를 미리 시작

        Task bTasks = Task.Run(() => BTask(1));



        // B Task 인스턴스 3개를 시작에서 시간 단축

        //Task[] bTasks = new Task[NumberOfBTasks];

        //for (int i = 0; i < NumberOfBTasks; i++)

        //{

        //    bTasks[i] = Task.Run(() => BTask(i));

        //}




        // A Task 시작

        await ATask();


        // B Task 인스턴스들이 작업을 모두 완료할 때까지 기다림

        taskQueue.CompleteAdding();

        await Task.WhenAll(bTasks);


        Console.WriteLine("Main completed.");

        Console.WriteLine(stopwatch.ElapsedMilliseconds);


    }


    static async Task ATask()

    {

        for (int j = 0; j <= 300; j++)

        {

            ACount += 1;

            Console.WriteLine("A Task started.");

            Console.WriteLine($"Account = {ACount}");

            Console.WriteLine("A Task completed.");


            // A Task가 완료되면 작업을 B Task에 추가

            taskQueue.Add($"Task {j}");

        }


    }


    static void BTask(int taskId)

    {

        foreach (var item in taskQueue.GetConsumingEnumerable())

        {

            Console.WriteLine($"B Task {taskId} processing {item}.{ACount}");

            Task.Delay(1000).Wait(); // B Task의 작업을 시뮬레이션 (예: 1초 대기)

        }

        Console.WriteLine($"B Task {taskId} completed all tasks.");

    }

}


댓글 쓰기

댓글 목록