본문 바로가기
공부/게임서버

TaskCreationOptions.LongRunning 사용법과 주의사항

by samosa 2024. 11. 9.

TaskCreationOptions.LongRunningTask를 생성할 때 장기 실행 작업에 대해 쓰레드 풀에서 별도의 전용 스레드를 사용하도록 지시하는 옵션입니다. 이 옵션은 Task가 오래 지속될 것이라는 점을 알려주어, 쓰레드 풀이 다른 작업에 영향을 주지 않고 최적화할 수 있도록 도와줍니다.

사용 예시

internal class Program
{
    private static void Main(string[] args)
    {
        // LongRunning 옵션을 사용하여 전용 스레드에서 작업 실행
        var longRunningTask = new Task(() =>
        {
            Console.WriteLine("장기 실행 작업 시작");
            Thread.Sleep(5000); // 긴 작업 시뮬레이션
            Console.WriteLine("장기 실행 작업 완료");
        }, TaskCreationOptions.LongRunning);

        longRunningTask.Start();

        Console.WriteLine("메인 스레드는 다른 작업을 계속합니다.");
        longRunningTask.Wait(); // 작업 완료까지 대기
    }
}

TaskCreationOptions.LongRunning의 주요 특징

  1. 전용 스레드 생성:
    • 이 옵션을 사용하면 작업이 기본적으로 쓰레드 풀의 스레드를 사용하지 않고 새 전용 스레드에서 실행됩니다. 이는 Thread를 직접 생성하는 것과 비슷한 결과를 냅니다.
    • 효과: CPU 바운드 또는 장시간 지속되는 작업이 다른 쓰레드 풀 작업의 성능에 영향을 주지 않게 합니다.
  2. 성능과 리소스:
    • TaskCreationOptions.LongRunning은 전용 스레드를 사용하므로, 작업이 쓰레드 풀에서 실행될 때보다 더 많은 시스템 리소스를 사용합니다.
    • 주의사항: 이 옵션을 남용하면 프로그램의 성능에 부정적인 영향을 미칠 수 있습니다. 따라서 이 옵션은 정말로 장시간 실행되는 작업에만 사용하는 것이 좋습니다.
  3. 비교: 일반 Task와의 차이:
    • 기본적으로 Task.Run이나 Task.Factory.StartNew는 쓰레드 풀의 스레드를 재사용하여 작업을 실행합니다. 반면, TaskCreationOptions.LongRunning은 전용 스레드를 사용하여 쓰레드 풀의 스레드가 장기 작업으로 차단되지 않도록 합니다.

주의사항

  1. 리소스 관리:
    • 전용 스레드 생성에는 추가적인 메모리 및 스케줄링 리소스가 필요합니다. 따라서 프로그램에서 너무 많은 LongRunning 옵션을 사용하면 메모리 부족이나 성능 저하를 초래할 수 있습니다.
    • 적절한 사용: 고성능 애플리케이션에서는 장기 실행 작업에만 LongRunning 옵션을 사용하고, 짧은 작업에는 기본 쓰레드 풀을 활용하세요.
  2. 스레드 풀 부하 완화:
    • 이 옵션은 쓰레드 풀이 과부하된 상태에서 긴 작업이 수행되어야 할 때 유용합니다. 기본적인 비동기 작업이나 짧은 작업에서는 이 옵션을 사용할 필요가 없습니다.
  3. Thread 직접 생성과의 차이:
    • TaskCreationOptions.LongRunningThread를 직접 생성하는 것과 유사하지만, Task의 장점을 활용할 수 있습니다. 예를 들어, await와 같은 비동기 구문과 쉽게 통합할 수 있습니다.

결론: TaskCreationOptions.LongRunning은 장시간 지속되는 작업이 필요할 때만 사용해야 하며, 쓰레드 풀이 불필요하게 전용 스레드로 작업을 옮기는 오버헤드를 피하기 위해 짧은 작업에는 사용하지 않는 것이 좋습니다.