본문 바로가기

C#

C# PriorityQueue<T>를 이용한 우선순위 작업 처리

C# 9.0(.NET 6)부터 새롭게 추가된 PriorityQueue<TElement, TPriority> 클래스는 우선순위 큐를 간편하게 구현할 수 있도록 도와줍니다. 이를 활용하면 작업들을 우선순위에 따라 효율적으로 처리할 수 있습니다.

1. PriorityQueue 기본 사용법

PriorityQueue는 요소와 우선순위 값을 함께 저장하고, 우선순위가 높은 요소부터 꺼낼 수 있습니다. 아래는 기본적인 예제입니다.

// 우선순위 큐 생성 (값: string, 우선순위: int)
var pq = new PriorityQueue<string, int>();

// 작업 추가 (값, 우선순위)
pq.Enqueue("중요 작업", 1);   // 1이 가장 높은 우선순위
pq.Enqueue("일반 작업", 5);
pq.Enqueue("보통 작업", 3);

// 우선순위 높은 작업부터 처리
while (pq.Count > 0)
{
    string work = pq.Dequeue();
    Console.WriteLine($"처리 중: {work}");
}

2. 실무에서 우선순위 작업 처리 예

예를 들어, 이벤트 처리 시스템에서 긴급 이벤트를 먼저 처리하고자 할 때 다음과 같이 쓸 수 있습니다.

public class TaskItem
{
    public string Name { get; set; }
    public int Priority { get; set; }
}

var tasks = new PriorityQueue<TaskItem, int>();

tasks.Enqueue(new TaskItem { Name = "긴급 알림", Priority = 1 }, 1);
tasks.Enqueue(new TaskItem { Name = "로그 기록", Priority = 5 }, 5);
tasks.Enqueue(new TaskItem { Name = "데이터 백업", Priority = 3 }, 3);

while (tasks.Count > 0)
{
    var task = tasks.Dequeue();
    Console.WriteLine($"작업 처리: {task.Name} (우선순위 {task.Priority})");
}

3. 우선순위 큐 활용 팁

- 우선순위는 작을수록 높은 우선순위를 의미합니다 (기본 동작). 필요에 따라 우선순위 값을 반대로 설정할 수도 있습니다.

- 동등한 우선순위 간 처리 순서는 보장되지 않습니다. 만약 순서를 보장해야 한다면 별도의 순번 값을 추가하세요.

- PriorityQueue<TElement,TPriority>는 스레드 안전하지 않아 멀티 스레드 환경에서 사용하려면 별도 동기화가 필요합니다.

간단한 우선순위 작업 처리가 필요할 때 PriorityQueue를 적극 활용해 보세요.