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

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

개발자로서 비동기 프로그래밍은 매우 유익할 수 있으며, 애플리케이션의 성능, 효율성, 응답성을 개선할 수 있습니다. 특히 완성하는 데 시간이 예측할 수 없게 소요되는 작업을 다루는 애플리케이션에 유리합니다. 특정 시나리오에서 교착 상태를 피하기 위해 ConfigureAwait(false)를 사용할 수 있습니다. 비동기 프로그래밍에서 데드락은 동기화 컨텍스트(예: 데스크탑 응용 프로그램의 UI 스레드)가 작업이 완료되기를 기대하며 진행하는 경우 발생합니다. 그러나 기다리던 작업은 동기화 컨텍스트가 사용 가능하기를 기다리고 있어 순환 대기를 만듭니다.

오늘은 IronPDF와 함께 ConfigureAwait을(를) 사용하여 비동기 프로그래밍을 통해 PDF 처리 작업을 효율적으로 수행하는 방법을 살펴보겠습니다. IronPDF는 PDF 관련 작업을 쉽게 처리할 수 있는 .NET PDF 라이브러리입니다. 강력한 기능 세트와 뛰어난 크로스 플랫폼 호환성, 광범위한 문서를 갖춘 이 도구는 개발자 도구에 필수적인 PDF 도구입니다.

C#에서 비동기 프로그래밍 이해하기

비동기 프로그래밍이란 무엇인가?

비동기 프로그래밍은 특정 작업이 메인 응용 프로그램 스레드와 독립적으로 실행될 수 있도록 코드를 작성하는 방법을 의미합니다. 이는 I/O 작업과 같이 대기가 필요한 장기 작업에 유용합니다. 이러한 작업을 메인 스레드를 차단하지 않고 실행할 수 있으므로 응용 프로그램은 이러한 작업이 완료되는 동안 계속 실행되어 궁극적으로 응용 프로그램의 성능과 응답성을 향상시킬 수 있습니다.

비동기 코드에서 ConfigureAwait 역할

ConfigureAwait는 비동기 프로그래밍에서 계속 실행 여부를 제어하는 데 사용되는 메서드입니다. 기본적으로 await 표현식 후에 실행되는 코드는 await 현재 컨텍스트를 캡처하고 해당 컨텍스트로 다시 연속을 디스패치하려고 하지만, 이는 비효율적일 수 있습니다. ConfigureAwait를 사용하면 캡처된 컨텍스트에서 연속을 실행할지 여부를 지정할 수 있습니다. 옵션은 ConfigureAwait(true)로 표시되고, 실행하지 않는 경우에는 ConfigureAwait(false)으로 표시됩니다.

ConfigureAwait(false)를 사용하면 교착 상태를 방지할 수 있는데, 이는 작업이 현재의 동기화 컨텍스트를 캡처하지 않고 원래의 컨텍스트에서 다시 시작하려고 시도하지 않도록 지시하기 때문입니다. 이렇게 하면 계속이 원래 컨텍스트가 아닌 스레드 풀 스레드에서 실행될 수 있으며, 따라서 메인 스레드가 차단되는 것을 방지할 수 있습니다.

ConfigureAwait(false)는 라이브러리 코드나 원래 컨텍스트로 복귀할 필요가 없는 경우에 특히 유용하며, 이를 통해 코드를 유연하게 하고 교착 상태 방지를 보장합니다.

IronPDF와 함께 ConfigureAwait 사용하는 방법

IronPDF를 .NET 프로젝트에 설정하기

.NET 프로젝트에서 IronPDF를 사용하려면 먼저 IronPDF NuGet 패키지를 설치하세요. 도구 > NuGet 패키지 관리자 > 솔루션용 NuGet 패키지 관리자로 이동하고 IronPDF를 검색하면 됩니다.

C# ConfigureAwait (개발자를 위한 작동 방식): 그림 1

또는 패키지 관리자 콘솔에서 다음 명령을 실행하여 설치할 수 있습니다.

Install-Package IronPdf

IronPDF를 코드에서 사용하기 시작하려면 코드 파일 상단에 using IronPdf; 문을 배치했는지 확인하세요. 환경에 IronPDF를 설치하는 데 대한 더 깊이 있는 가이드는 시작하기 페이지를 참조하세요.

IronPDF를 사용하여 비동기적으로 PDF 생성하기

비동기적으로 PDF 파일을 생성하는 것은 특히 대량의 PDF 파일을 생성하거나 여러 작업을 동시에 수행해야 하는 경우 매우 유익할 수 있습니다. IronPDF를 사용하면 비동기적으로 PDF 관련 작업을 수행할 수 있으며, 이는 다음과 같은 비동기 코드처럼 보일 수 있습니다:

using IronPdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await GeneratePdfAsync();
    }

    static async Task GeneratePdfAsync()
    {
        // Create a new instance of ChromePdfRenderer.
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Example HTML content to be converted into a PDF.
        string htmlContent = "<h1>Hello World!</h1>";

        // Asynchronously render the HTML content as a PDF document.
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Asynchronously save the PDF document to a file.
        await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));

        Console.WriteLine("Working!");
    }
}
using IronPdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await GeneratePdfAsync();
    }

    static async Task GeneratePdfAsync()
    {
        // Create a new instance of ChromePdfRenderer.
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Example HTML content to be converted into a PDF.
        string htmlContent = "<h1>Hello World!</h1>";

        // Asynchronously render the HTML content as a PDF document.
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Asynchronously save the PDF document to a file.
        await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));

        Console.WriteLine("Working!");
    }
}
Imports IronPdf
Imports System.Threading.Tasks

Friend Class Program
	Shared Async Function Main(ByVal args() As String) As Task
		Await GeneratePdfAsync()
	End Function

	Private Shared Async Function GeneratePdfAsync() As Task
		' Create a new instance of ChromePdfRenderer.
		Dim renderer As New ChromePdfRenderer()

		' Example HTML content to be converted into a PDF.
		Dim htmlContent As String = "<h1>Hello World!</h1>"

		' Asynchronously render the HTML content as a PDF document.
		Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync(htmlContent)

		' Asynchronously save the PDF document to a file.
		Await Task.Run(Function() pdf.SaveAs("outputAsync.pdf"))

		Console.WriteLine("Working!")
	End Function
End Class
$vbLabelText   $csharpLabel

이 코드에서는 GeneratePdfAsync() 메서드에서 비동기적으로 PDF 문서를 생성했습니다. ChromePdfRenderer는 HTML 콘텐츠에서 PDF 파일을 생성하는 데 중요한 렌더러를 만드는 데 사용됩니다. PdfDocument 클래스는 제공된 HTML 문자열에서 PDF를 생성하는 데 사용되지만, HTML 파일, URL, 이미지 등에서도 PDF를 생성할 수 있습니다. IronPDF를 사용하여 PDF를 생성하는 다양한 방법을 보려면 PDF 생성 방법 섹션을 확인하세요.

비동기적으로 대형 PDF 파일 작업하기

대용량 PDF 파일을 처리할 때 ConfigureAwait(false)와 비동기 메서드를 사용하면 긴 작업 중 메인 스레드를 해제하여 성능을 크게 개선할 수 있습니다. 이 예제에서는 대형 PDF 문서를 받아 비동기 PDF 처리의 이점을 보여주기 위해 텍스트 추출 작업을 수행했습니다.

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

class Program
{
    static async Task Main(string[] args)
    {
        await LongPdfTask();
    }

    static async Task LongPdfTask()
    {
        try
        {
            // Initialize IronPDF's PdfDocument asynchronously.
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);

            // Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
            string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);

            // Write the extracted text to a file asynchronously.
            await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);

            Console.WriteLine("Extraction complete!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in LongPdfTask: {ex.Message}");
        }
    }
}
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;

class Program
{
    static async Task Main(string[] args)
    {
        await LongPdfTask();
    }

    static async Task LongPdfTask()
    {
        try
        {
            // Initialize IronPDF's PdfDocument asynchronously.
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);

            // Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
            string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);

            // Write the extracted text to a file asynchronously.
            await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);

            Console.WriteLine("Extraction complete!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in LongPdfTask: {ex.Message}");
        }
    }
}
Imports IronPdf
Imports System.Threading.Tasks
Imports System.IO
Imports System

Friend Class Program
	Shared Async Function Main(ByVal args() As String) As Task
		Await LongPdfTask()
	End Function

	Private Shared Async Function LongPdfTask() As Task
		Try
			' Initialize IronPDF's PdfDocument asynchronously.
			Dim pdf As PdfDocument = Await Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(False)

			' Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
			Dim text As String = Await Task.Run(Function() pdf.ExtractAllText()).ConfigureAwait(False)

			' Write the extracted text to a file asynchronously.
			Await Task.Run(Sub() File.WriteAllText("extractedText.txt", text)).ConfigureAwait(False)

			Console.WriteLine("Extraction complete!")
		Catch ex As Exception
			Console.WriteLine($"Error in LongPdfTask: {ex.Message}")
		End Try
	End Function
End Class
$vbLabelText   $csharpLabel

위의 코드에서는 대규모, 시간 소모적인 작업 중 모든 텍스트를 추출하는 데 ConfigureAwait(false)가 사용되었으며, 실제로 200페이지가 넘는 큰 PDF 파일에서 수행되었습니다.

  • 가져오기 및 설정: 코드 상단의 첫 번째 섹션은 필요한 라이브러리와 네임스페이스를 가져오는 데 전념합니다. IronPDF 라이브러리를 사용하려면 using IronPdf;가 필요합니다.
  • 클래스와 메인 메서드: class Program는 이 프로젝트의 메인 애플리케이션 코드를 포함하는 클래스를 정의합니다. static async Task Main(string[] args)는 애플리케이션의 진입점입니다. 여기에서는 비동기 작업을 실행할 수 있도록 async로 표시했습니다. 그런 다음, LongPdfTask 메서드를 비동기적으로 호출하기 위해 await LongPdfTask()를 사용합니다.
  • Try 블록: LongPdfTask 메서드 내의 코드를 try-catch 블록으로 감싸 예기치 않은 예외를 우아하게 처리합니다.

    • PdfDocument PDF = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false): 이 줄은 세 가지 다른 부분으로 나뉠 수 있습니다:

    • PdfDocument.FromFile("Sample.pdf"): 이 부분은 지정된 PDF 파일을 IronPdf.PdfDocument 객체로 동기식으로 로드합니다.
    • await Task.Run(() => ...): PDF 로드 작업을 별도의 스레드에서 실행하여 메인 스레드가 차단되지 않도록 합니다. 이를 통해 비동기 작업이 됩니다.
    • .ConfigureAwait(false): 현재 컨텍스트 캡처를 피하여 성능을 개선하고 데드락을 줄여야 합니다.
  • string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false): IronPDF 텍스트 추출 메서드, ExtractAllText()를 실행합니다. 여기서도 비동기적으로 별도의 스레드에서 이 작업을 실행하기 위해 await Task.Run(() => ...)이 사용됩니다.
  • await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false): 이로 인해 await Task 메서드를 사용하여 .txt 파일로 텍스트를 비동기적으로 작성합니다.

이전

C# ConfigureAwait (개발자를 위한 작동 방식): 그림 2

출력

C# ConfigureAwait (개발자를 위한 작동 방식): 그림 3

.NET 애플리케이션에서의 ConfigureAwait 사용을 위한 모범 사례

ConfigureAwait(true) vs. ConfigureAwait(false)를 언제 사용할 것인가

ConfigureAwait(false)는 동기화 컨텍스트를 보존할 필요가 없는 라이브러리 코드나 백그라운드 처리에 적합합니다. 일반적으로 성능이 중요한 서버 측 코드에 해당합니다. ConfigureAwait(false)await 작업이 완료된 후, 불필요하게 비동기 작업을 시작한 동일한 스레드에서 연속 처리를 하지 않도록 합니다.

PDF 처리에 있어서 ConfigureAwait(false)를 구현하면 컨텍스트 전환과 관련된 병목현상을 피하기 위해 여러 PDF 처리 작업을 실행할 때 성능을 극대화할 수 있습니다. 이는 또한 많은 양의 PDF 파일을 처리할 때 애플리케이션의 원활한 실행을 보장하고, 컨솔 애플리케이션이나 백그라운드 서비스에서 작업할 때 효율성을 유지하는 데 도움이 됩니다.

ConfigureAwait(true)는 UI, 코드에 대한 유닛 테스트, 또는 연속 처리가 동일한 컨텍스트에서 실행되어야 하는 ASP.NET 애플리케이션에서 가장 잘 사용되며, 잘못 사용할 경우 교착 상태로 이어질 수 있습니다. 예를 들어, UI를 업데이트하거나 httpcontext에 접근할 경우입니다. ConfigureAwait(true)는 기본 동작이며, ConfigureAwait로도 작성할 수 있습니다.

PDF 처리 작업과 함께 사용하는 경우, UI와 밀접하게 통합되어 있는 경우 (WPF, WinForms 등의 UI 애플리케이션 사용 시) 연속 처리가 UI 스레드에서 이루어지도록 동기화 컨텍스트를 캡처해야 할 때 특히 유용합니다. 특정 스레드에서 실행되어야 하는 스레드 민감 작업을 할 때도 유익합니다.

비동기 IronPDF 작업의 예외 처리

비동기 프로그래밍에서 예외 처리는 중요하므로 신중한 고려가 필요하며, 처리되지 않은 예외는 애플리케이션을 종료시킬 수 있습니다. 비동기 코드 주위에 try-catch 블록을 사용하는 것은 예상치 못한 예외를 우아하게 처리하는 훌륭한 방법입니다.

예를 들어:

public async Task SafeGeneratePdfAsync()
{
    try
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Asynchronously render HTML as PDF and do not capture the context
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);

        // Asynchronously save PDF to file
        await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
public async Task SafeGeneratePdfAsync()
{
    try
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Asynchronously render HTML as PDF and do not capture the context
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);

        // Asynchronously save PDF to file
        await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
Public Async Function SafeGeneratePdfAsync() As Task
	Try
		Dim renderer As New ChromePdfRenderer()

		' Asynchronously render HTML as PDF and do not capture the context
		Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(False)

		' Asynchronously save PDF to file
		Await Task.Run(Function() pdf.SaveAs("output.pdf")).ConfigureAwait(False)
	Catch ex As Exception
		Console.WriteLine($"An error occurred: {ex.Message}")
	End Try
End Function
$vbLabelText   $csharpLabel

ConfigureAwait(false)와 연속 작업을 사용할 때는 연속 내부에서 try-catch로 예외를 처리하거나, Task.ContinueWith를 사용하는 경우 Task.Exception 속성을 통해 예외를 처리할 수 있습니다.

이를 위한 코드 작성 예는 다음과 같습니다:

class Program
{
    public static async Task Main(string[] args)
    {
        await ProcessPdfWithContinuationAsync();
    }

    static Task ProcessPdfWithContinuationAsync()
    {
        return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
            .ContinueWith(pdfTask =>
            {
                if (pdfTask.IsFaulted)
                {
                    // Handle exceptions from loading the PDF
                    Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
                    return;
                }
                var pdf = pdfTask.Result;
                // Extract text asynchronously with exception handling
                Task.Run(() => pdf.ExtractAllText())
                    .ContinueWith(extractTask =>
                    {
                        if (extractTask.IsFaulted)
                        {
                            // Handle exceptions from extracting text
                            Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
                            return;
                        }
                        // Proceed if text extraction is successful
                        Console.WriteLine("Extracted text:");
                        Console.WriteLine(extractTask.Result);
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
    }
}
class Program
{
    public static async Task Main(string[] args)
    {
        await ProcessPdfWithContinuationAsync();
    }

    static Task ProcessPdfWithContinuationAsync()
    {
        return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
            .ContinueWith(pdfTask =>
            {
                if (pdfTask.IsFaulted)
                {
                    // Handle exceptions from loading the PDF
                    Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
                    return;
                }
                var pdf = pdfTask.Result;
                // Extract text asynchronously with exception handling
                Task.Run(() => pdf.ExtractAllText())
                    .ContinueWith(extractTask =>
                    {
                        if (extractTask.IsFaulted)
                        {
                            // Handle exceptions from extracting text
                            Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
                            return;
                        }
                        // Proceed if text extraction is successful
                        Console.WriteLine("Extracted text:");
                        Console.WriteLine(extractTask.Result);
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
    }
}
Friend Class Program
	Public Shared Async Function Main(ByVal args() As String) As Task
		Await ProcessPdfWithContinuationAsync()
	End Function

	Private Shared Function ProcessPdfWithContinuationAsync() As Task
		Return Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ContinueWith(Sub(pdfTask)
				If pdfTask.IsFaulted Then
					' Handle exceptions from loading the PDF
					Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}")
					Return
				End If
				Dim pdf = pdfTask.Result
				' Extract text asynchronously with exception handling
				Task.Run(Function() pdf.ExtractAllText()).ContinueWith(Sub(extractTask)
						If extractTask.IsFaulted Then
							' Handle exceptions from extracting text
							Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}")
							Return
						End If
						' Proceed if text extraction is successful
						Console.WriteLine("Extracted text:")
						Console.WriteLine(extractTask.Result)
				End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
		End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
	End Function
End Class
$vbLabelText   $csharpLabel

왜 IronPDF를 귀하의 PDF 처리 요구에 선택해야 할까요?

IronPDF의 주요 기능과 장점

C# ConfigureAwait (개발자를 위한 작동 방식): 그림 4

IronPDF는 강력한 C# PDF 라이브러리로, 모든 PDF 관련 작업을 위한 풍부한 기능 세트를 제공합니다. .NET 8, 7, 6, .NET Core, Standard 및 Framework에 대한 완전한 지원과 Windows, Linux, Mac, Docker, Azure 및 AWS와 같은 다양한 앱 환경에서의 실행이 가능하므로, 선호하는 환경에 관계없이 IronPDF의 이점을 최대한 누릴 수 있습니다.

IronPDF를 사용하면 다양한 파일 및 데이터 타입에서 PDF를 생성할 수 있습니다; HTML 파일, HTML 문자열, URL, 이미지, DOCX, 그리고 RTF를 포함하며, 종종 단 몇 줄의 코드로 처리할 수 있습니다! PDF 문서의 서식을 처리하고 사용자 지정 워터마크를 적용하며, PDF를 병합 또는 분할하고, PDF 암호화보안을 처리하는 등의 작업을 수행할 수 있습니다.

IronPDF의 비동기 프로그래밍 지원

IronPDF는 많은 작업에 대한 비동기 메서드를 제공하여 개발자가 async/await 패턴을 원활하게 활용할 수 있도록 합니다. 이 지원은 성능이 중요한 애플리케이션에 IronPDF를 통합하여 응답성을 해치지 않도록 보장하므로, 비동기 환경에서 PDF 관련 작업을 수행하는 개발자에게 매우 유용한 PDF 도구입니다.

라이선스

IronPDF의 무료 체험 기간을 통해 스스로 IronPDF를 체험하고 다양한 기능을 탐색해 보세요. 간단하고 빠른 설치로 PDF 프로젝트에서 IronPDF를 빠르게 실행할 수 있습니다. 계속 사용하고 강력한 기능을 활용하여 PDF 작업을 한 단계 업그레이드하고 싶으신가요? 라이선스는 단 $799부터 시작하며, 30일 환불 보장, 1년간의 제품 지원 및 업데이트, 영구 라이선스로 제공됩니다(성가신 반복 요금이 없습니다!).

C# ConfigureAwait (개발자를 위한 작동 방식): 그림 5

예제: PDF 생성에 ConfigureAwait 및 IronPDF 사용

PDF를 비동기적으로 생성하려면 IronPDF를 사용하여 HTML 파일을 렌더링하고, 결과를 저장하며, ConfigureAwait(false)를 사용하여 연속 처리가 불필요하게 원래의 동기화 컨텍스트로 전환되지 않도록 합니다.

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

class Program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }

    static async Task<string> CreateInvoicePdfAsync()
    {
        // Instance of ChromePdfRenderer to convert HTML to PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            // Render HTML file as a PDF asynchronously without capturing the context.
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);

            // Save the generated PDF asynchronously.
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);

            return "invoice.pdf";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
using IronPdf;
using System.Threading.Tasks;
using System;

class Program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }

    static async Task<string> CreateInvoicePdfAsync()
    {
        // Instance of ChromePdfRenderer to convert HTML to PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            // Render HTML file as a PDF asynchronously without capturing the context.
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);

            // Save the generated PDF asynchronously.
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);

            return "invoice.pdf";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
Imports IronPdf
Imports System.Threading.Tasks
Imports System

Friend Class Program
	Public Shared Async Function Main(ByVal args() As String) As Task
		Await CreateInvoicePdfAsync()
	End Function

	Private Shared Async Function CreateInvoicePdfAsync() As Task(Of String)
		' Instance of ChromePdfRenderer to convert HTML to PDF
		Dim renderer As New ChromePdfRenderer()
		Try
			' Render HTML file as a PDF asynchronously without capturing the context.
			Dim pdf = Await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(False)

			' Save the generated PDF asynchronously.
			Await Task.Run(Function() pdf.SaveAs("invoice.pdf")).ConfigureAwait(False)

			Return "invoice.pdf"
		Catch ex As Exception
			Console.WriteLine($"Error generating PDF: {ex.Message}")
			Return Nothing
		End Try
	End Function
End Class
$vbLabelText   $csharpLabel

이 예제에서는 우리가 만든 비동기 메서드인 static async Task CreateInvoicePdfAsync()를 사용하여 RenderHtmlFileAsPdfAsync 메서드가 제공하는 HTML 파일로부터 PDF 송장을 생성합니다. 우리는 ConfigureAwait(false)를 사용하여 이 작업의 연속 처리를 원래의 동기화 컨텍스트에서 방지하여 비 UI 애플리케이션의 성능을 개선했습니다.

await Task.Run()) => ...) 메서드도 다시 사용하여 작업을 비동기적으로 실행했습니다. 마지막으로 pdf.SaveAs 메서드를 사용하여 새롭게 생성된 PDF 파일을 "invoice.pdf"로 저장했습니다. 모든 코드는 CreateInvoicePdfAsync() 메서드 내에서 try-catch 블록으로 감싸져 있어, 예상치 못한 예외를 처리할 수 있습니다.

HTML 파일

C# ConfigureAwait (개발자를 위한 작동 방식): 그림 6

출력

C# ConfigureAwait (개발자를 위한 작동 방식): 그림 7

보시다시피 HTML 파일을 비동기적으로 PDF로 성공적으로 생성했으며, 명확하고 고품질의 PDF 파일이 생성되었습니다.

결론

비동기 프로그래밍은 응답성과 효율적인 .NET 애플리케이션을 구축하는 데 필수적이며, ConfigureAwait를 올바르게 사용하는 것은 최적의 성능 달성에 도움이 되며, 특히 애플리케이션 수준 코드를 작성할 때 유용합니다. IronPDF를 사용할 때, 비동기 메서드와 ConfigureAwait(false)를 활용하면 PDF 처리 작업이 메인 스레드를 차단하지 않도록 하여 애플리케이션의 전체 응답성을 개선합니다. ConfigureAwait를 언제 어떻게 사용할 지 이해하면 IronPDF의 PDF 처리 작업을 더욱 강력하고 성능 친화적으로 만들 수 있습니다.

이제 비동기 프로그래밍에서 ConfigureAwait와 IronPDF를 활용하는 전문가로서 나아갈 준비가 되었습니다. 무엇을 망설이고 있나요? 지금 IronPDF를 사용해 보세요, PDF 관련 프로젝트가 얼마나 개선될 수 있는지 확인해 보세요! 강력한 범용 라이브러리 코드로서 IronPDF가 제공하는 광범위한 기능에 대해 더 알고 싶으시다면 유용한 사용 방법 가이드를 확인하십시오. 또는 IronPDF를 비동기 프로그래밍 메서드와 함께 사용하는 방법에 대해 더 읽고 싶거나, IronPDF에 대해 일반적으로 더 알고 싶다면 우리의 블로그 게시물을 확인하세요. 더 많은 비동기 PDF 생성 예제를 찾고 있다면, 우리의 C# Wait For Seconds 게시물 또는 C# Task.Run에 대한 다른 게시물을 확인하세요.

자주 묻는 질문

비동기 프로그래밍에서 ConfigureAwait란 무엇인가요?

ConfigureAwait는 await 표현식 후의 계속 실행이 원래의 동기화 컨텍스트에서 실행될지 다른 컨텍스트에서 실행될지를 지정하는 비동기 프로그래밍에서 사용되는 메서드입니다. ConfigureAwait(false)를 사용하면 동기화 컨텍스트를 캡처하지 않아 교착 상태를 방지하는 데 도움이 됩니다.

C#에서 PDF를 비동기적으로 생성하려면 어떻게 해야 하나요?

IronPDF의 비동기 메서드를 사용하여 C#에서 PDF를 비동기적으로 생성할 수 있습니다. 이는 특히 큰 파일을 다룰 때 메인 애플리케이션 스레드를 차단하지 않아 효율성과 응답성을 향상시킵니다.

C# 애플리케이션에서 ConfigureAwait(false)를 사용해야 하는 이유는 무엇인가요?

ConfigureAwait(false)를 사용하면 계속 실행이 스레드 풀 스레드에서 실행될 수 있게 하여 불필요한 컨텍스트 전환과 잠재적인 교착 상태를 피할 수 있습니다. 특히 라이브러리 코드에서 성능을 높이는 데 도움이 됩니다.

.NET에서 PDF 처리를 위해 IronPDF를 사용하는 이점은 무엇인가요?

IronPDF는 PDF 생성, 텍스트 추출, 병합과 같은 광범위한 기능을 제공하며, 우수한 크로스 플랫폼 호환성을 자랑합니다. 비동기 프로그래밍을 지원하여 성능이 중요한 애플리케이션에 적합합니다.

비동기 PDF 처리 작업에서 예외를 어떻게 처리할 수 있나요?

비동기 PDF 처리 작업에서는 async 메서드 주변에 try-catch 블록을 사용하여 예외를 관리할 수 있습니다. IronPDF는 예외를 우아하게 처리할 수 있게 하여 애플리케이션의 안정성을 보장합니다.

비동기 메서드는 IronPDF로 PDF 처리에 어떻게 기여하나요?

IronPDF의 비동기 메서드는 메인 애플리케이션 스레드를 차단하지 않고 PDF 처리 작업을 실행할 수 있게 합니다. 이는 특히 크거나 복잡한 PDF 작업에 대해 애플리케이션의 응답성과 효율성을 향상시킵니다.

라이브러리 코드에서 ConfigureAwait를 사용할 때 핵심 고려사항은 무엇인가요?

라이브러리 코드에서 ConfigureAwait를 사용할 때는 동기화 컨텍스트를 캡처하지 않도록 ConfigureAwait(false)를 사용하는 것이 중요합니다. 이를 통해 비동기 작업에서 성능을 향상시키고 교착 상태를 방지할 수 있습니다.

C# 프로젝트에 IronPDF를 설정하려면 어떻게 해야 하나요?

C# 프로젝트에 IronPDF를 설정하려면 NuGet 패키지 관리자를 사용하여 IronPDF를 검색하거나 패키지 관리자 콘솔에서 Install-Package IronPdf 명령을 실행하면 됩니다.

IronPDF는 개발자에게 어떤 가치를 제공하나요?

IronPDF는 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시간 온라인으로 운영합니다.
채팅
이메일
전화해