연속 작업이 있을 경우 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.");
}
}