
C# BackgroundWorker (개발자를 위한 동작 방식)
IronPDF로 PDF를 생성하는 것은 .NET 개발자에게 흔한 작업입니다—특히 동적 보고서, 청구서 또는 문서 자동화 시스템을 구축할 때 특히 그렇습니다. 하지만 Windows Forms나 WPF 앱의 메인 UI 스레드에서 PDF 생성을 트리거한 적이 있다면 사용자 인터페이스가 멈추거나 응답하지 않는 것을 보셨을 것입니다. 큰 HTML 콘텐츠를 렌더링하거나 복잡한 PDF 레이아웃을 처리할 때 특히 그렇습니다.
이때 C# BackgroundWorker 클래스가 등장합니다. 이 문서는 UI를 잠그지 않고 데스크톱 앱에서 비동기 작업을 처리하기 위해 BackgroundWorker와 IronPDF를 통합하는 방법을 설명합니다.
왜 IronPDF와 함께 BackgroundWorker를 사용하는가?
UI 응답성 유지
PDF 생성과 같은 CPU 집약적이거나 IO 바운드 작업을 메인 스레드에서 실행하면 UI가 잠깁니다. 사용자는 애플리케이션이 바쁠 때 클릭하거나 드래그하거나 상호작용할 수 없습니다. BackgroundWorker 객체를 사용하여 작업을 별도의 스레드로 이동하면, 백그라운드 처리 중에도 인터페이스가 빠르고 사용할 수 있게 유지할 수 있습니다.
보고서 생성 및 장시간 실행 작업에 적합
앱이 데이터를 내보내거나 HTML을 PDF로 변환하거나 상세 보고서를 렌더링하는 작업을 포함한다면, 이를 백그라운드 작업자로 넘겨주는 것이 애플리케이션을 더 전문적이고 성능 좋게 만듭니다.
기존 WinForms 앱과 호환
비록 현대적인 앱은 종종 비동기/대기를 사용하지만, 많은 오래된 프로젝트는 여전히 Visual Studio에서의 단순성과 디자인 시간 지원 덕분에 BackgroundWorker의 혜택을 받습니다.
IronPDF 란 무엇인가요?

IronPDF는 C#에서 PDF 문서를 생성, 편집 및 작업할 수 있도록 설계된 강력한 .NET 라이브러리입니다. 이는 머릿속 크로미엄 브라우저를 사용하여 개발자가 HTML, CSS, JavaScript, 심지어 복잡한 웹 페이지를 정확하고 인쇄 품질의 PDF로 변환할 수 있게 합니다. 전통적인 PDF 생성기와 달리, IronPDF는 문서를 브라우저에서 보이는 대로 정확히 렌더링하여 레이아웃, 글꼴, 이미지, 스타일을 픽셀 단위로 일치시킵니다.
주요 기능
- HTML을 PDF로 변환 – HTML 문자열, URL 또는 전체 웹 페이지를 PDF로 렌더링합니다.
- 이미지 및 텍스트 렌더링 – 프로그램적으로 헤더, 푸터, 워터마크 및 이미지를 추가합니다.
- PDF 병합 및 분할 – 여러 문서를 결합하거나 특정 페이지를 추출합니다.
- 양식 채우기 및 주석 달기 – 대화형 PDF 양식과 함께 작업합니다.
- 외부 종속성 없음 – Adobe Acrobat 또는 Microsoft Office가 설치되어 있지 않은 상태에서도 작동합니다.
IronPDF는 .NET Framework, .NET Core 및 .NET 6/7+를 지원하므로 데스크톱 및 웹 기반 .NET 애플리케이션 모두에 적합합니다.
NuGet를 통한 IronPDF 설치
시작하려면 NuGet 패키지 관리자를 사용하여 프로젝트에 IronPDF를 설치하세요:
이것은 IronPDF의 ChromePdfRenderer, HtmlToPdf 및 기타 강력한 기능을 사용할 수 있도록 필요한 모든 참조를 추가할 것입니다.
이 예제에서는 Visual Studio로 생성된 Windows Forms 애플리케이션을 사용하고, PDF 생성을 트리거하는 버튼과 프로세스 완료를 표시하는 레이블을 사용할 것입니다.
IronPDF를 위한 BackgroundWorker 구현
이제 구조적이고 안전한 방법으로 BackgroundWorker를 사용하는 프로세스를 분해하기 위해 다음 코드 예제를 사용할 것입니다:
1단계 – BackgroundWorker 정의
디자이너 또는 코드에서 BackgroundWorker를 생성하고 구성할 수 있습니다. 다음은 코드 접근 방식입니다:
private void SetupBackgroundWorker()
{
// new backgroundworker worker instance
worker = new BackgroundWorker(); // dowork event handler
worker.DoWork += PdfWorker_DoWork;
worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted; // final result handler
}Private Sub SetupBackgroundWorker()
' new backgroundworker worker instance
worker = New BackgroundWorker() ' dowork event handler
worker.DoWork += PdfWorker_DoWork
worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted ' final result handler
End Sub백그라운드 실행 및 완료를 위한 필요한 이벤트를 초기화하고 연결합니다.
2단계 – DoWork 이벤트 처리
DoWork 메서드는 다른 스레드에서 실행되며 백그라운드 작업(PDF 생성)을 수행합니다:
private void PdfWorker_DoWork(object sender, DoWorkEventArgs e)
{
var Renderer = new ChromePdfRenderer();
// Simulate input from UI or parameters
string htmlContent = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>";
string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf");
// Generate PDF
var pdf = Renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs(outputPath);
// Optionally pass result info
e.Result = outputPath; // pass value to RunWorkerCompleted
}Private Sub PdfWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim Renderer = New ChromePdfRenderer()
' Simulate input from UI or parameters
Dim htmlContent As String = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>"
Dim outputPath As String = Path.Combine(Environment.CurrentDirectory, "Report.pdf")
' Generate PDF
Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs(outputPath)
' Optionally pass result info
e.Result = outputPath ' pass value to RunWorkerCompleted
End Sub참고: 이곳에서는 작업자 스레드에서 실행되므로 UI 컨트롤과 상호 작용할 수 없습니다.
3단계 – RunWorkerCompleted를 사용하여 완료 알림
백그라운드 스레드가 완료되면 UI를 안전하게 업데이트할 수 있습니다.
private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show("Error: " + e.Error.Message);
}
else
{
string savedPath = e.Result.ToString();
MessageBox.Show("PDF created at:\n" + savedPath);
}
}Imports Microsoft.VisualBasic
Private Sub PdfWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
If e.Error IsNot Nothing Then
MessageBox.Show("Error: " & e.Error.Message)
Else
Dim savedPath As String = e.Result.ToString()
MessageBox.Show("PDF created at:" & vbLf & savedPath)
End If
End Sub4단계 – UI에서 BackgroundWorker 트리거
클릭 시 백그라운드 작업을 실행하는 시작 버튼을 추가합니다:
private void btnGeneratePDF_Click(object sender, EventArgs e)
{
if (pdfWorker == null)
SetupBackgroundWorker();
if (!pdfWorker.IsBusy)
{
btnGeneratePDF.Enabled = false;
pdfWorker.RunWorkerAsync(); // execute method in background
}
}Private Sub btnGeneratePDF_Click(ByVal sender As Object, ByVal e As EventArgs)
If pdfWorker Is Nothing Then
SetupBackgroundWorker()
End If
If Not pdfWorker.IsBusy Then
btnGeneratePDF.Enabled = False
pdfWorker.RunWorkerAsync() ' execute method in background
End If
End Sub전체 코드 예시
여기에 모든 것이 단일 작동 Windows Forms 스니펫으로 통합되어 있습니다:
using System;
using System.ComponentModel;
using IronPdf;
using System.IO;
using System.Windows.Forms;
namespace TestApp
{
public partial class Form1 : Form
{
private BackgroundWorker worker;
public Form1()
{
InitializeComponent();
SetupBackgroundWorker(); }
private void SetupBackgroundWorker()
{
worker = new BackgroundWorker();
worker.DoWork += PdfWorker_DoWork;
worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted;
}
private void btnGeneratePDF_Click(object sender, EventArgs e)
{
if (!worker.IsBusy)
{
btnGeneratePDF.Enabled = false;
worker.RunWorkerAsync();
}
}
private void PdfWorker_DoWork(object sender, DoWorkEventArgs e)
{
var Renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Report</h1><p>This PDF was generated in the background.</p>";
string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf");
var pdf = Renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs(outputPath);
e.Result = outputPath;
}
private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
btnGeneratePDF.Enabled = true;
if (e.Error != null)
{
MessageBox.Show("Failed: " + e.Error.Message);
}
else
{
MessageBox.Show("PDF created: " + e.Result.ToString());
}
}
private void btnGeneratePDF_Click_1(object sender, EventArgs e)
{
if (!worker.IsBusy)
{
btnGeneratePDF.Enabled = false;
worker.RunWorkerAsync();
}
}
}
}Imports System
Imports System.ComponentModel
Imports IronPdf
Imports System.IO
Imports System.Windows.Forms
Namespace TestApp
Partial Public Class Form1
Inherits Form
Private worker As BackgroundWorker
Public Sub New()
InitializeComponent()
SetupBackgroundWorker()
End Sub
Private Sub SetupBackgroundWorker()
worker = New BackgroundWorker()
AddHandler worker.DoWork, AddressOf PdfWorker_DoWork
AddHandler worker.RunWorkerCompleted, AddressOf PdfWorker_RunWorkerCompleted
End Sub
Private Sub btnGeneratePDF_Click(ByVal sender As Object, ByVal e As EventArgs)
If Not worker.IsBusy Then
btnGeneratePDF.Enabled = False
worker.RunWorkerAsync()
End If
End Sub
Private Sub PdfWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim Renderer = New ChromePdfRenderer()
Dim htmlContent As String = "<h1>Report</h1><p>This PDF was generated in the background.</p>"
Dim outputPath As String = Path.Combine(Environment.CurrentDirectory, "Report.pdf")
Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs(outputPath)
e.Result = outputPath
End Sub
Private Sub PdfWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
btnGeneratePDF.Enabled = True
If e.Error IsNot Nothing Then
MessageBox.Show("Failed: " & e.Error.Message)
Else
MessageBox.Show("PDF created: " & e.Result.ToString())
End If
End Sub
Private Sub btnGeneratePDF_Click_1(ByVal sender As Object, ByVal e As EventArgs)
If Not worker.IsBusy Then
btnGeneratePDF.Enabled = False
worker.RunWorkerAsync()
End If
End Sub
End Class
End Namespace양식 출력

PDF 출력

모범 사례
DoWork에서 UI 액세스 피하기
DoWork 이벤트 핸들러는 다른 스레드에서 실행되므로 UI 요소에 직접 액세스할 수 없습니다. 안전한 UI 업데이트를 위해 RunWorkerCompleted 또는 컨트롤 Invoke() 호출을 사용하세요.
비동기 취소 지원
작업이 길 경우, WorkerSupportsCancellation = true를 활성화하고 DoWork 내에서 CancellationPending을 모니터링하여 요청된 취소를 지원하세요.
진행 상황 업데이트 보고 사용(선택 사항)
WorkerReportsProgress = true를 활성화하고 ProgressChanged 이벤트를 사용하여 진행률 표시줄이나 메시지를 표시할 수 있습니다.
입력 인수 유효성 검사
RunWorkerAsync(인수)를 사용할 때, DoWork에서 인수를 유효성 검사하고 e.Result를 통해 어떤 메서드 결과든 반환하십시오.
결론
IronPDF와 함께 BackgroundWorker를 사용하면 애플리케이션을 반응성 있게 유지하면서 백그라운드 스레드에서 무거운 PDF 렌더링 작업을 수행할 수 있습니다. 이는 PDF 생성과 같은 장시간 작업 동안 반응성 UI 업데이트가 필요한 WinForms 또는 WPF 앱 작업 시 특히 유용합니다.
DoWork 이벤트 핸들러를 처리하고, 최종 결과를 모니터링하며, RunWorkerCompleted 이벤트에서 안전하게 사용자 인터페이스를 업데이트함으로써 백그라운드 작업이 원활히 실행되도록 보장합니다.
비록 비동기/대기가 종종 새로운 애플리케이션에 선호되지만, BackgroundWorker는 레거시 또는 WinForms 프로젝트에 대해 신뢰할 수 있는 도구로 남아 있습니다. 보고서를 내보내거나 즉석에서 문서를 생성할 때, 이 접근 방식은 IronPDF를 최대한 활용하는 동시에 앱을 부드럽고 사용자 친화적으로 유지하는 데 도움이 될 것입니다.
직접 시도해 보시겠습니까?
무료 IronPDF 체험판을 다운로드하여 오늘 C#에서 강력한 PDF 솔루션을 시작하세요. 체험판은 이 기사에 소개된 기능에 대한 전체 액세스를 제공하며, 신용 카드가 필요하지 않습니다.

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


