푸터 콘텐츠로 바로가기
.NET 도움말

C# Cancellationtoken (개발자를 위한 작동 방식)

현대 소프트웨어 개발에서 장기 실행 작업을 효율적으로 관리하는 것은 특히 대규모 또는 복잡한 PDF 파일 생성이 일반적인 응용 프로그램에서 중요합니다. C# 개발자는 종종 IronPDF에 의존하여 매끄러운 PDF 생성을 수행하지만, 잠재적으로 긴 PDF 생성 작업을 처리하려면 사용자 중단이나 취소를 관리하는 방법이 필요합니다.

여기서 C#의 CancellationToken이 중요한 역할을 합니다. IronPDF와 통합하여 PDF 생성 작업이 응답성과 효율성을 동시에 갖추도록 보장할 수 있습니다. 이 기사에서는 CancellationToken의 중요성, IronPDF와 잘 어울리는 이유, 작업을 우아하게 취소하는 방법에 대해 탐구합니다.

C#에서 CancellationToken이란 무엇인가?

CancellationToken은 C#의 비동기 프로그래밍에서 기본적인 부분입니다. 작업이 취소되어야 함을 신호할 수 있어, 개발자가 장기 실행 작업에 대한 더 큰 제어권을 가지게 해줍니다. 이것은 보고서나 청구서 생성과 같은 작업을 수행할 때 특히 유용할 수 있으며, 목표 금액에 도달할 때까지 데이터를 지속적으로 사용하여 동적 보고서를 생성하고 이 시점에서 C# 취소 토큰을 사용하여 작업이 취소되어야 함을 신호하여 프로그램을 우아하게 종료할 수 있습니다.

어떻게 작동하나요?

본질적으로, CancellationToken은 작업이나 메서드에 전달되며, 주기적으로 취소 요청이 있는지를 확인합니다. 그렇게 되면, 작업이 우아하게 종료되어 자원을 해제하고 응용 프로그램의 응답성을 향상시킬 수 있습니다. 이는 복잡한 문서가 생성하는 데 시간이 걸릴 수 있는 PDF 생성과 같은 경우에 특히 유용합니다.

CancellationTokens을 사용하면 시스템 리소스 낭비 및 사용자 경험 저하와 같은 불필요하게 오래 실행되는 작업의 잠재적 단점을 피할 수 있습니다.

내부 취소 토큰

C#에서 내부 취소 토큰은 외부 소스에서 전달되는 것이 아니라 특정 클래스나 메서드 내에서 생성되고 관리되는 취소 토큰을 의미합니다. 이렇게 하면 단일 구성요소의 범위 내에서 작업 취소를 더 세밀하게 제어할 수 있어 내부에서 시작되는 취소 요청을 모니터하고 응답할 수 있습니다.

내부 취소 토큰을 사용하는 것은 취소 로직을 클래스 소비자에게 노출하지 않고 캡슐화하려는 시나리오에서 특히 유용하여 깔끔한 인터페이스를 유지할 수 있습니다. 이 접근 방식은 코드 모듈성을 향상시킬 수 있으며, 여전히 광범위한 CancellationToken 프레임워크가 제공하는 유연성을 활용하면서 복잡한 비동기 워크플로 관리가 더 쉬워집니다.

IronPDF와 취소 토큰을 사용할 이유는?

특히 웹 애플리케이션이나 복잡한 보고 시스템에서 PDF를 생성할 때, 사용자가 대형 PDF 파일을 생성하는 작업을 시작하지만 탐색을 떠나거나 더 이상 결과를 필요로 하지 않는 상황이 발생할 수 있습니다. 이 경우 서버나 UI에 불필요한 부하를 피하기 위해 PDF 생성 프로세스를 취소할 수 있는 옵션이 필요합니다.

다음은 IronPDF와 함께 CancellationToken을 사용하는 것이 중요한 이유입니다:

1. 불필요한 부하 방지

사용자가 요청한 PDF가 더 이상 필요하지 않은 경우 해당 프로세스를 지속할 이유가 없습니다. CancellationToken을 활용하면 PDF 생성 작업을 중단하여 서버에 대한 과도한 부하를 방지하고 전체 애플리케이션 성능을 개선할 수 있습니다.

2. 사용자 경험 향상

데스크톱 애플리케이션에서 PDF 생성은 UI 스레드에서 발생할 수 있으며, 작업이 오랜 시간 실행되면 사용자 인터페이스가 잠길 수 있습니다. CancellationToken을 통합하면 사용자는 작업을 취소하고 애플리케이션의 응답성을 유지할 수 있습니다.

3. 확장성 향상

여러 사용자가 동시에 PDF를 생성하는 웹 애플리케이션에서는 확장성이 중요합니다. CancellationToken을 사용하면 불필요한 작업을 안전하게 취소하여 다른 요청을 효율적으로 처리할 수 있도록 리소스를 확보할 수 있습니다.

IronPDF와 CancellationToken 구현 방법

CancellationToken이 유용한 이유를 이해했으니 이제 IronPDF와 함께 어떻게 구현할지 알아보겠습니다.

단계 1: 프로젝트에서 IronPDF 설정하기

IronPDF를 사용하기 시작하려면 먼저 설치해야 합니다. 이미 설치되어 있는 경우 다음 섹션으로 건너뛸 수 있습니다; 그렇지 않다면, 다음 단계는 IronPDF 라이브러리를 설치하는 방법을 다룹니다.

NuGet 패키지 관리자 콘솔을 통해

NuGet 패키지 관리자 콘솔을 사용하여 IronPDF를 설치하려면, Visual Studio를 열고 패키지 관리자 콘솔로 이동합니다. 그런 다음 다음 명령을 실행합니다:

Install-Package IronPdf

솔루션용 NuGet 패키지 관리자를 통해

Visual Studio를 열고 "도구 -> NuGet 패키지 관리자 -> 솔루션용 NuGet 패키지 관리"로 이동하여 IronPDF를 검색합니다. 여기서 프로젝트를 선택하고 "설치" 버튼을 클릭하면 IronPDF가 프로젝트에 추가됩니다.

IronPDF를 설치한 후, 코드 상단에 올바른 using 문만 추가하면 IronPDF를 사용할 수 있습니다:

using IronPdf;
using IronPdf;
Imports IronPdf
$vbLabelText   $csharpLabel

단계 2: 비동기 PDF 생성 방법에서 취소 토큰 사용하기

이제 실제 구현으로 들어가 보겠습니다. 이 예제에서는 IronPDF를 사용하여 HTML에서 간단한 PDF를 생성할 것이며, 필요시 작업을 취소할 수 있는 CancellationToken을 사용할 것입니다.

using IronPdf;
using System;
using System.Threading;
using System.Threading.Tasks;

public class PdfGenerator
{
    public async Task GeneratePdfWithCancellation(CancellationToken token)
    {
        var Renderer = new ChromePdfRenderer();
        try
        {
            // Check for cancellation before starting
            token.ThrowIfCancellationRequested();

            // Simulating a long task that can be checked for cancellation periodically
            for (int i = 0; i < 10; i++)
            {
                // Simulating a piece of work (this could be part of a larger HTML rendering)
                await Task.Delay(500); // Simulate chunk processing

                // Periodically check for cancellation in long-running operations
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Cancellation requested. Throwing exception.");
                    token.ThrowIfCancellationRequested();  // This will trigger an OperationCanceledException
                }
            }

            // Simulate PDF creation after the long process
            var pdf = await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>");

            // Save the PDF after ensuring no cancellation occurred
            pdf.SaveAs("output.pdf");
            Console.WriteLine("PDF generated successfully.");
        }
        catch (OperationCanceledException)
        {
            // Handle task cancellation
            Console.WriteLine("PDF generation was canceled.");
        }
        catch (Exception ex)
        {
            // Handle other exceptions
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource
        var cancellationTokenSource = new CancellationTokenSource();

        // Create our cancellation token
        var token = cancellationTokenSource.Token;

        // Start the PDF generation task
        var pdfGenerator = new PdfGenerator();
        Task pdfTask = pdfGenerator.GeneratePdfWithCancellation(token);

        // Simulate a cancellation scenario
        Console.WriteLine("Press any key to cancel PDF generation...");
        Console.ReadKey();

        // Cancel the task by calling Cancel() on the CancellationTokenSource
        cancellationTokenSource.Cancel();

        try
        {
            // Await the task to handle any exceptions, such as cancellation
            await pdfTask;
        }
        catch (OperationCanceledException)
        {
            // Confirm the cancellation
            Console.WriteLine("The PDF generation was canceled.");
        }
        finally
        {
            cancellationTokenSource.Dispose();
        }

        Console.WriteLine("Program finished.");
    }
}
using IronPdf;
using System;
using System.Threading;
using System.Threading.Tasks;

public class PdfGenerator
{
    public async Task GeneratePdfWithCancellation(CancellationToken token)
    {
        var Renderer = new ChromePdfRenderer();
        try
        {
            // Check for cancellation before starting
            token.ThrowIfCancellationRequested();

            // Simulating a long task that can be checked for cancellation periodically
            for (int i = 0; i < 10; i++)
            {
                // Simulating a piece of work (this could be part of a larger HTML rendering)
                await Task.Delay(500); // Simulate chunk processing

                // Periodically check for cancellation in long-running operations
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Cancellation requested. Throwing exception.");
                    token.ThrowIfCancellationRequested();  // This will trigger an OperationCanceledException
                }
            }

            // Simulate PDF creation after the long process
            var pdf = await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>");

            // Save the PDF after ensuring no cancellation occurred
            pdf.SaveAs("output.pdf");
            Console.WriteLine("PDF generated successfully.");
        }
        catch (OperationCanceledException)
        {
            // Handle task cancellation
            Console.WriteLine("PDF generation was canceled.");
        }
        catch (Exception ex)
        {
            // Handle other exceptions
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource
        var cancellationTokenSource = new CancellationTokenSource();

        // Create our cancellation token
        var token = cancellationTokenSource.Token;

        // Start the PDF generation task
        var pdfGenerator = new PdfGenerator();
        Task pdfTask = pdfGenerator.GeneratePdfWithCancellation(token);

        // Simulate a cancellation scenario
        Console.WriteLine("Press any key to cancel PDF generation...");
        Console.ReadKey();

        // Cancel the task by calling Cancel() on the CancellationTokenSource
        cancellationTokenSource.Cancel();

        try
        {
            // Await the task to handle any exceptions, such as cancellation
            await pdfTask;
        }
        catch (OperationCanceledException)
        {
            // Confirm the cancellation
            Console.WriteLine("The PDF generation was canceled.");
        }
        finally
        {
            cancellationTokenSource.Dispose();
        }

        Console.WriteLine("Program finished.");
    }
}
Imports IronPdf
Imports System
Imports System.Threading
Imports System.Threading.Tasks

Public Class PdfGenerator
	Public Async Function GeneratePdfWithCancellation(ByVal token As CancellationToken) As Task
		Dim Renderer = New ChromePdfRenderer()
		Try
			' Check for cancellation before starting
			token.ThrowIfCancellationRequested()

			' Simulating a long task that can be checked for cancellation periodically
			For i As Integer = 0 To 9
				' Simulating a piece of work (this could be part of a larger HTML rendering)
				Await Task.Delay(500) ' Simulate chunk processing

				' Periodically check for cancellation in long-running operations
				If token.IsCancellationRequested Then
					Console.WriteLine("Cancellation requested. Throwing exception.")
					token.ThrowIfCancellationRequested() ' This will trigger an OperationCanceledException
				End If
			Next i

			' Simulate PDF creation after the long process
			Dim pdf = Await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>")

			' Save the PDF after ensuring no cancellation occurred
			pdf.SaveAs("output.pdf")
			Console.WriteLine("PDF generated successfully.")
		Catch e1 As OperationCanceledException
			' Handle task cancellation
			Console.WriteLine("PDF generation was canceled.")
		Catch ex As Exception
			' Handle other exceptions
			Console.WriteLine($"An error occurred: {ex.Message}")
		End Try
	End Function
End Class

Public Class Program
	Public Shared Async Function Main(ByVal args() As String) As Task
		' Create a CancellationTokenSource
		Dim cancellationTokenSource As New CancellationTokenSource()

		' Create our cancellation token
		Dim token = cancellationTokenSource.Token

		' Start the PDF generation task
		Dim pdfGenerator As New PdfGenerator()
		Dim pdfTask As Task = pdfGenerator.GeneratePdfWithCancellation(token)

		' Simulate a cancellation scenario
		Console.WriteLine("Press any key to cancel PDF generation...")
		Console.ReadKey()

		' Cancel the task by calling Cancel() on the CancellationTokenSource
		cancellationTokenSource.Cancel()

		Try
			' Await the task to handle any exceptions, such as cancellation
			Await pdfTask
		Catch e1 As OperationCanceledException
			' Confirm the cancellation
			Console.WriteLine("The PDF generation was canceled.")
		Finally
			cancellationTokenSource.Dispose()
		End Try

		Console.WriteLine("Program finished.")
	End Function
End Class
$vbLabelText   $csharpLabel

콘솔 출력

C# Cancellationtoken (개발자에게 어떻게 작동하는가): 그림 2 - 콘솔 출력

PDF 출력

C# Cancellationtoken (개발자에게 어떻게 작동하는가): 그림 3 - PDF 출력

이 예제에서는 IronPDF를 사용하여 오랜 시간 실행되는 PDF 생성 작업을 취소하기 위한 CancellationToken을 C# 프로그램에서 사용하는 방법을 보여줍니다. 코드는 두 부분으로 구성되어 있습니다: PDF 생성 프로세스 (PdfGenerator 클래스)와 메인 프로그램 로직 (Program 클래스).

  • 클래스 PdfGenerator: 이 클래스는 CancellationToken을 통한 취소를 지원하면서 PDF 파일을 생성하는 시뮬레이션 메서드를 포함합니다.
  • 우리는 main 메서드에서 CancellationTokenSource()를 사용하여 취소 토큰 소스를 생성하고, CancellationTokenSource의 Token 속성을 전달하여 우리 토큰 객체를 생성합니다.
  • IronPDF 라이브러리의 ChromePdfRenderer는 HTML 콘텐츠를 PDF 문서로 렌더링하는 데 사용됩니다.
  • GeneratePdfWithCancellation 메소드는 비동기(async)이며, Task를 반환합니다. 이 메소드는 작업 취소 요청을 통한 취소 처리를 위해 CancellationToken (token)을 수락합니다.
  • CancellationToken을 사용하면 오랜 시간 실행되는 작업을 안전하게 취소할 수 있습니다. 그러나 취소는 협력적이며, 자체적으로 주기적으로 토큰 상태를 체크해야 합니다.
  • 이 코드에서는 주기적인 취소 검사를 통해 긴 작업을 시뮬레이트합니다. 중요한 점은 PDF 생성 프로세스 동안 취소를 수동으로 확인(token.IsCancellationRequested)하여 토큰이 전달되면 취소 메소드를 실행할 준비가 되어 있다는 것입니다.
  • 사용자가 프로그램 취소를 위한 키를 누르면 작업은 원활하게 중단되고 OperationCanceledException이 발생하여 PDF 생성이 적절하고 시기 적절하게 완료되지 않도록 합니다.
  • 취소가 발생하지 않은 경우 생성된 PDF는 "output.pdf"로 저장되어 프로그램이 전체 작업 프로세스를 실행하는 것을 방지합니다.

IronPDF와 CancellationToken의 실제 사용 사례

IronPDF와 하나 이상의 취소 토큰을 사용하면 애플리케이션의 성능과 사용자 경험을 향상시킬 수 있는 실제 상황이 여러 가지 있습니다. 여기 몇 가지 예가 있습니다:

1. 웹 애플리케이션

웹 애플리케이션에서는 사용자가 보고서 생성과 같은 PDF 형식의 작업을 자주 시작합니다. 그러나 사용자가 페이지를 벗어나거나 브라우저를 닫으면 시스템은 이를 감지하고 CancellationToken을 사용하여 PDF 생성 프로세스를 중단할 수 있습니다.

HttpContext.Response.RegisterForDispose(CancellationTokenSource);
HttpContext.Response.RegisterForDispose(CancellationTokenSource);
HttpContext.Response.RegisterForDispose(CancellationTokenSource)
$vbLabelText   $csharpLabel

이 간단한 구현은 필요하지 않은 작업에 자원을 할당하지 않음으로써 웹 서버가 더 효과적으로 확장할 수 있도록 합니다.

2. 장기 실행 보고서

보고 애플리케이션에서 사용자는 대규모 데이터 세트를 PDF로 내보내도록 요청할 수 있습니다. 사용자가 마음을 바꾸거나 잘못된 쿼리를 입력한 경우, CancellationToken을 통해 작업을 중간에 취소하여 자원의 낭비를 방지할 수 있습니다.

3. 백그라운드 서비스

백그라운드 서비스나 마이크로서비스에서 대규모 PDF 배치 생성과 같은 시간이 많이 소요되는 작업은 CancellationToken을 사용하여 더 효율적으로 관리할 수 있습니다. 서비스가 종료되거나 축소될 때 진행 중인 작업을 깔끔하게 취소하여 데이터 손실이나 손상을 방지합니다.

결론

이제 IronPDF와 함께 취소 토큰을 사용하는 것에 대한 오늘의 논의가 끝났으므로 전문가처럼 PDF 프로젝트에 이를 구현할 수 있습니다! C# CancellationTokenIronPDF와 함께 사용하면 PDF 생성 작업을 우아하게 처리하는 보다 효율적이고 반응성 있는 애플리케이션을 구축할 수 있습니다. 이 접근 방식은 작업이 수행 중인 동안 안전한 지점에서 취소 요청을 확인할 수 있도록 하여, 작업이 갑자기 종료되는 대신 협력적인 취소 모델을 가능하게 합니다.

장기 실행 보고서를 관리하든, 웹 애플리케이션에서 주문형 PDF 생성을 하든, 백그라운드 서비스를 다루든, CancellationToken이나 여러 토큰을 동시에 포함하면 불필요한 작업을 취소하여 자원의 낭비를 방지하고 사용자 경험을 향상시킬 수 있습니다.

몇 줄의 코드를 통해 앱의 확장성과 반응성을 개선하고 사용자가 자신의 행동에 더 많은 통제력을 가질 수 있게 합니다. 아직 IronPDF를 탐색하지 않았다면 지금 무료 체험을 시도하여 C# 프로젝트를 변형할 수 있는 강력한 PDF 생성 기능을 발견하기에 완벽한 시기입니다.

자주 묻는 질문

C#에서 오랫동안 실행되는 작업을 관리하기 위해 CancellationToken을 어떻게 사용할 수 있습니까?

오랫동안 실행되는 작업에 CancellationToken을 통합하려면, 작업에 전달하고 주기적으로 취소 요청을 확인하십시오. 이렇게 하면 작업을 우아하게 종료하여 자원을 해제하고 애플리케이션의 응답성을 유지할 수 있습니다.

PDF 생성에서 CancellationToken이 중요한 이유는 무엇입니까?

PDF 생성에서 CancellationToken은 사용자가 페이지를 이동할 때와 같이 불필요하게 되는 작업을 취소하여 자원을 효과적으로 관리하는 데 도움을 줍니다. 이로 인해 과도한 서버 부하를 방지하고 사용자 경험을 향상시킵니다.

C# PDF 생성 작업에서 CancellationToken을 어떻게 구현할 수 있습니까?

C# PDF 생성 작업에서 CancellationToken을 구현하려면, 토큰을 메서드에 전달하고 실행 중에 주기적으로 취소 요청을 확인합니다. 취소가 감지되면 작업을 우아하게 종료할 수 있습니다.

PDF 생성에서 CancellationToken과 비동기 메서드를 사용하는 목적은 무엇입니까?

PDF 생성에서 CancellationToken과 비동기 메서드를 사용하면 작업을 비동기적으로 실행할 수 있어 애플리케이션의 응답성을 개선하고 더 이상 필요하지 않을 경우 작업을 취소할 수 있습니다.

웹 애플리케이션에서 CancellationToken이 사용자 경험을 어떻게 향상시키나요?

CancellationToken을 활용하면 사용자가 페이지를 이동할 때 PDF 생성과 같은 작업을 취소하여 불필요한 처리를 방지하고 애플리케이션을 응답성 있게 유지할 수 있어 사용자 경험을 향상시킵니다.

ChromePdfRenderer는 비동기 PDF 생성에서 어떤 역할을 하나요?

IronPDF의 ChromePdfRenderer는 HTML 콘텐츠를 PDF 문서로 변환하는 데 사용됩니다. 비동기 작업을 지원하여 CancellationToken을 사용해 작업 수명 주기와 응답성을 효과적으로 관리할 수 있습니다.

PDF 생성 중에 취소 요청이 발생하면 어떤 일이 벌어질 수 있나요?

PDF 생성 중에 취소 요청이 발생하면 작업은 CancellationToken 상태를 확인합니다. 취소가 감지되면 OperationCanceledException을 던져서 프로세스를 중지하고 자원을 절약합니다.

CancellationToken이 애플리케이션의 확장성을 어떻게 향상시키나요?

CancellationToken은 PDF 생성 시 불필요한 작업을 취소할 수 있게 함으로써 자원 소비를 줄이고 애플리케이션의 전체 성능을 향상시켜 확장성을 높입니다.

백그라운드 서비스에서 CancellationToken을 사용하는 이점은 무엇입니까?

백그라운드 서비스에서는 CancellationToken을 사용하여 배치 PDF 처리와 같은 오랫동안 실행되는 작업을 관리할 수 있으며, 서비스 종료 시나 확장 작업 시 우아하게 작업을 취소할 수 있습니다.

IronPDF와 CancellationToken의 통합이 애플리케이션 효율성을 어떻게 향상시키나요?

IronPDF와 CancellationToken의 통합은 불필요한 PDF 생성 작업을 취소하여 자원 관리를 개선함으로써 애플리케이션의 효율성과 응답성을 향상하고 서버 부하를 줄입니다.

제이콥 멜러, 팀 아이언 최고기술책임자
최고기술책임자

제이콥 멜러는 Iron Software의 최고 기술 책임자(CTO)이자 C# PDF 기술을 개척한 선구적인 엔지니어입니다. Iron Software의 핵심 코드베이스를 최초로 개발한 그는 창립 초기부터 회사의 제품 아키텍처를 설계해 왔으며, CEO인 캐머런 리밍턴과 함께 회사를 NASA, 테슬라, 그리고 전 세계 정부 기관에 서비스를 제공하는 50명 이상의 직원을 보유한 기업으로 성장시켰습니다.

제이콥은 맨체스터 대학교에서 토목공학 학사 학위(BEng)를 최우등으로 취득했습니다(1998~2001). 1999년 런던에서 첫 소프트웨어 회사를 설립하고 2005년 첫 .NET 컴포넌트를 개발한 후, 마이크로소프트 생태계 전반에 걸쳐 복잡한 문제를 해결하는 데 전문성을 발휘해 왔습니다.

그의 대표 제품인 IronPDF 및 Iron Suite .NET 라이브러리는 전 세계적으로 3천만 건 이상의 NuGet 설치 수를 기록했으며, 그의 핵심 코드는 전 세계 개발자들이 사용하는 다양한 도구에 지속적으로 활용되고 있습니다. 25년의 실무 경험과 41년의 코딩 전문성을 바탕으로, 제이콥은 차세대 기술 리더들을 양성하는 동시에 기업 수준의 C#, Java, Python PDF 기술 혁신을 주도하는 데 주력하고 있습니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해