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

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 란 무엇인가요?

C# BackgroundWorker (개발자를 위한 작동 원리): 그림 1 - 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를 설치하세요:

Install-Package 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 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
$vbLabelText   $csharpLabel

백그라운드 실행 및 완료를 위한 필요한 이벤트를 초기화하고 연결합니다.

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 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
$vbLabelText   $csharpLabel

참고: 이곳에서는 작업자 스레드에서 실행되므로 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);
    }
}
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 Sub
$vbLabelText   $csharpLabel

4단계 – 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 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
$vbLabelText   $csharpLabel

전체 코드 예시

여기에 모든 것이 단일 작동 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();
            }
        }
    }
}
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
$vbLabelText   $csharpLabel

폼 출력

C# BackgroundWorker (개발자를 위한 작동 원리): 그림 2 - PDF 생성 후 폼 출력

PDF 출력

C# BackgroundWorker (개발자를 위한 작동 원리): 그림 3 - 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 솔루션을 시작하세요. 체험판은 이 기사에 소개된 기능에 대한 전체 액세스를 제공하며, 신용 카드가 필요하지 않습니다.

자주 묻는 질문

C# Windows Forms 응용 프로그램에서 UI가 멈추지 않도록 하면서 PDF 생성을 수행하는 방법은 무엇입니까?

별도의 스레드에서 PDF 생성을 수행하기 위해 C# BackgroundWorker 클래스를 IronPDF와 함께 사용할 수 있습니다. 이는 프로세스 중 메인 UI 스레드가 계속 반응성을 유지하도록 보장합니다.

BackgroundWorker에서 DoWork 이벤트 핸들러의 역할은 무엇입니까?

DoWork 이벤트 핸들러는 IronPDF를 사용한 PDF 생성과 같은 장기 실행 작업을 실행하는 장소입니다. 이는 UI와 별도의 스레드에서 실행되어 인터페이스가 멈추지 않도록 합니다.

백그라운드 PDF 생성 작업의 결과로 UI를 업데이트하는 방법은 무엇입니까?

RunWorkerCompleted 이벤트를 사용하여 PDF 생성 결과로 UI를 업데이트하십시오. 이 이벤트는 백그라운드 작업이 완료되면 트리거되어 UI 요소와 안전하게 상호작용할 수 있게 합니다.

오래된 .NET 응용 프로그램에서 PDF 처리를 위한 BackgroundWorker 사용의 이점은 무엇입니까?

BackgroundWorker는 레거시 WinForms 응용 프로그램에서 비동기 작업을 구현하는 간단한 방법을 제공하며, IronPDF와 같은 작업을 처리하는 간단한 모델을 제공하여 UI가 반응성을 유지하도록 합니다.

BackgroundWorker를 사용하여 PDF 생성 작업을 취소할 수 있습니까?

예, BackgroundWorker는 작업 취소를 지원합니다. DoWork 이벤트 핸들러에서 CancellationPending 속성을 확인하고 작업을 우아하게 종료함으로써 취소를 구현할 수 있습니다.

BackgroundWorker를 사용하여 PDF 생성의 진행 상태를 추적하는 방법은 무엇입니까?

BackgroundWorker의 ReportProgress 메소드를 사용하여 DoWork 메소드에서 진행 상황을 보고할 수 있습니다. 이를 통해 PDF 생성 중 진행 정보를 UI에 업데이트할 수 있습니다.

DoWork 이벤트 핸들러에서 UI 업데이트를 피해야 하는 이유는 무엇입니까?

UI 업데이트는 DoWork 이벤트 핸들러에서 피해야 하는데, 이는 별도의 스레드에서 실행되기 때문입니다. 직접적인 UI 조작은 스레딩 문제를 일으킬 수 있습니다. 대신 RunWorkerCompleted 또는 ProgressChanged 이벤트를 사용하여 UI 업데이트를 해야 합니다.

C#에서 PDF 생성을 위해 BackgroundWorker를 설정하는 절차는 무엇입니까?

BackgroundWorker 설정에는 작업자를 초기화하고 DoWork 및 RunWorkerCompleted 이벤트를 처리하며 RunWorkerAsync를 사용하여 작업을 시작하는 것이 포함됩니다. 이 설정은 IronPDF와 같은 작업을 수행하기 위해 사용됩니다.

.NET 응용 프로그램에서 PDF 생성을 위해 현대적 비동기/대기 패턴을 사용해야 합니까?

현대적 비동기/대기 패턴은 새로운 응용 프로그램에 권장되지만, BackgroundWorker는 비동기 작업을 처리하는 데 있어서 IronPDF를 활용하는 등 오래된 WinForms 응용 프로그램에서 유용한, 간단하고 사용하기 쉬운 방법을 제공합니다.

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

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