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

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

현대 .NET 응용 프로그램에서 이벤트 중심 프로그래밍은 응답성을 향상시키고 원활한 사용자 경험을 보장하는데 중요한 역할을 합니다. PDF 생성과 같은 작업이 시간이 걸릴 때에는 메인 스레드를 차단하고 싶지 않으실 것입니다. 대신, 이벤트 핸들러를 사용하여 작업을 비동기적으로 실행하고 이벤트가 발생하면 반응하세요. 이를 통해 애플리케이션이 더욱 상호작용적이고 응답성이 높아집니다.

이 가이드에서는 데스크톱 및 웹 환경에서 원활한 PDF 워크플로를 위해 C# 이벤트 처리 메서드와 IronPDF를 통합하는 방법을 보여드리겠습니다. WinForms, WPF 또는 다른 C# 프로그래밍 언어 기반 플랫폼을 사용하든지 간에, 이 가이드가 당신을 지원합니다.

IronPDF 프로젝트 설정

이벤트 처리로 뛰어들기 전에 .NET 프로젝트에서 IronPDF를 빠르게 설정해 봅시다.

NuGet을 통해 IronPDF 설치하기

Visual Studio의 패키지 관리자 콘솔에서 다음을 실행하십시오:

Install-Package IronPdf

이는 IronPDF를 사용해 PDF를 생성하는 데 필요한 모든 것을 설치합니다.

IronPDF를 사용한 기본 PDF 생성

IronPDF가 작동하는지 확인하기 위한 간단한 예시입니다:

using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF!</h1>");
pdf.SaveAs("example.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF!</h1>");
pdf.SaveAs("example.pdf");
Imports IronPdf
Private renderer = New ChromePdfRenderer()
Private pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF!</h1>")
pdf.SaveAs("example.pdf")
$vbLabelText   $csharpLabel

이것이 작동하면, 이벤트 필드를 추가하고, 등록된 대리자를 연결하며, 대리자 유형을 사용하여 이벤트 드리븐 워크플로를 생성할 준비가 되었습니다.

C# Event Handler Fundamentals for .NET Developers

이벤트 드리븐 프로그래밍의 기본

이벤트 드리븐 프로그래밍에서는 PDF 파일 생성 완료와 같은 이벤트가 발생할 때 앱이 반응합니다. C#은 대리자를 타입 안전한 함수 포인터로 사용하여 앱이 반응해야 하는 방식을 정의할 수 있습니다.

보통, event 키워드를 사용하여 이벤트를 선언하고 그것을 이벤트 처리 메서드에 연결하며, 사용자 정의 EventArgs 서브 클래스 사용하여 데이터를 전달합니다.

event 키워드를 사용하여 이벤트 선언하기

C#은 event 키워드를 사용하여 이벤트 멤버를 선언합니다. 예를 들어:

public event EventHandler PdfGenerated;
public event EventHandler PdfGenerated;
Public Event PdfGenerated As EventHandler
$vbLabelText   $csharpLabel

이 줄은 PdfGenerated라는 이름의 이벤트 필드를 선언합니다. 이는 다음 매개변수 목록을 가진 기본 제공 대리자인 EventHandler를 사용하는데: (object sender, EventArgs e) — 종종 .NET의 이벤트 명명 패턴으로 참조됩니다.

Defining and Subscribing to Events in C

대리자를 사용하여 이벤트에 메서드 추가

C# 이벤트는 += 문법을 사용하여 런타임에 메서드를 동적으로 추가하는 것을 지원합니다. 방법은 다음과 같습니다.

pdfService.PdfGenerated += (s, e) =>
{
    Console.WriteLine("PDF was generated!");
};
pdfService.PdfGenerated += (s, e) =>
{
    Console.WriteLine("PDF was generated!");
};
AddHandler pdfService.PdfGenerated, Sub(s, e)
	Console.WriteLine("PDF was generated!")
End Sub
$vbLabelText   $csharpLabel

이 구독자 클래스는 PdfGenerated 이벤트를 대기하고, 트리거되었을 때 메서드 호출을 실행합니다.

사용자 정의 이벤트 데이터

생성된 파일 경로와 같은 이벤트 데이터를 전달하려면 EventArgs에서 파생된 클래스를 정의하십시오:

public class PdfGeneratedEventArgs : EventArgs
{
    public string FilePath { get; set; } // returned value
}
public class PdfGeneratedEventArgs : EventArgs
{
    public string FilePath { get; set; } // returned value
}
Public Class PdfGeneratedEventArgs
	Inherits EventArgs

	Public Property FilePath() As String ' -  returned value
End Class
$vbLabelText   $csharpLabel

그런 다음 일반 대리자 유형을 사용하여 이벤트를 재정의하십시오:

public event EventHandler<PdfGeneratedEventArgs> PdfGenerated;
public event EventHandler<PdfGeneratedEventArgs> PdfGenerated;
Public Event PdfGenerated As EventHandler(Of PdfGeneratedEventArgs)
$vbLabelText   $csharpLabel

이는 이벤트가 발생할 때 구조화된, 타입 안전한 데이터를 제공하여, 반응 로직을 더욱 강력하게 만듭니다.

여러 이벤트 처리하기

여러 이벤트를 정의할 수 있습니다:

public event EventHandler PdfGenerationStarted;
public event EventHandler<PdfGeneratedEventArgs> PdfGenerationCompleted;
public event EventHandler PdfGenerationStarted;
public event EventHandler<PdfGeneratedEventArgs> PdfGenerationCompleted;
Public Event PdfGenerationStarted As EventHandler
Public Event PdfGenerationCompleted As EventHandler(Of PdfGeneratedEventArgs)
$vbLabelText   $csharpLabel

각 이벤트 필드는 구독자 클래스에 의해 처리되며, 각 단계마다 개별 이벤트 핸들러 메서드를 허용합니다. 이러한 우려 사항의 분리는 복잡한 워크플로에서 의미가 있습니다.

IronPDF와 함께 이벤트 핸들러 사용하기

큰 PDF를 생성할 때 IronPDF를 백그라운드 스레드에서 실행하고 완료되면 UI에 알리는 것이 합리적입니다. 다음은 이벤트 드리븐 디자인이 도움이 되는 방법입니다:

  • BackgroundWorker를 사용하여 비동기적으로 PDF를 생성하십시오.
  • 각 단계가 완료될 때 이벤트를 발생시키십시오.
  • 이벤트 데이터 객체를 사용하여 결과 데이터를 전달하십시오.

코드 예시 – 비동기적으로 PDF 생성

다음 예시는 IronPDF와 함께 이벤트 처리를 사용하는 완전한 코드입니다:

using System;
using System.ComponentModel;
using IronPdf;
namespace IronPdfEventHandlerExample
{
    // 1. Define custom EventArgs to carry event data
    public class PdfGeneratedEventArgs : EventArgs
    {
        public string FilePath { get; set; }
    }
    // 2. Main class with event, BackgroundWorker, and logic
    public class PdfGenerator
    {
        // Declare the public event using EventHandler<t>
        public event EventHandler<PdfGeneratedEventArgs> PdfGenerated;
        private readonly BackgroundWorker _worker;
        public PdfGenerator()
        {
            _worker = new BackgroundWorker();
            _worker.DoWork += OnDoWork;
            _worker.RunWorkerCompleted += OnRunWorkerCompleted;
        }
        // Start the async operation
        public void GenerateAsync(string html, string outputPath)
        {
            _worker.RunWorkerAsync(new Tuple<string, string>(html, outputPath));
        }
        // Perform PDF generation in background
        private void OnDoWork(object sender, DoWorkEventArgs e)
        {
            var (html, path) = (Tuple<string, string>)e.Argument;
            var renderer = new HtmlToPdf();
            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs(path);
            e.Result = path;
        }
        // Notify subscribers when the PDF is ready
        private void OnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            var path = e.Result as string;
            PdfGenerated?.Invoke(this, new PdfGeneratedEventArgs { FilePath = path });
        }
    }
    // 3. Program to wire it all together
    class Program
    {
        public static void Main(string[] args)
        {
            var generator = new PdfGenerator();
            // Subscribe to the PdfGenerated event
            generator.PdfGenerated += OnPdfGenerated;
            Console.WriteLine("Generating PDF asynchronously...");
            generator.GenerateAsync("<h1>Hello, IronPDF!</h1>", "output.pdf");
            Console.WriteLine("Press any key to exit after generation.");
            Console.ReadKey();
        }
        // Event handler for when the PDF is ready
        static void OnPdfGenerated(object sender, PdfGeneratedEventArgs e)
        {
            Console.WriteLine($"PDF generated at: {e.FilePath}");
        }
    }
}
using System;
using System.ComponentModel;
using IronPdf;
namespace IronPdfEventHandlerExample
{
    // 1. Define custom EventArgs to carry event data
    public class PdfGeneratedEventArgs : EventArgs
    {
        public string FilePath { get; set; }
    }
    // 2. Main class with event, BackgroundWorker, and logic
    public class PdfGenerator
    {
        // Declare the public event using EventHandler<t>
        public event EventHandler<PdfGeneratedEventArgs> PdfGenerated;
        private readonly BackgroundWorker _worker;
        public PdfGenerator()
        {
            _worker = new BackgroundWorker();
            _worker.DoWork += OnDoWork;
            _worker.RunWorkerCompleted += OnRunWorkerCompleted;
        }
        // Start the async operation
        public void GenerateAsync(string html, string outputPath)
        {
            _worker.RunWorkerAsync(new Tuple<string, string>(html, outputPath));
        }
        // Perform PDF generation in background
        private void OnDoWork(object sender, DoWorkEventArgs e)
        {
            var (html, path) = (Tuple<string, string>)e.Argument;
            var renderer = new HtmlToPdf();
            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs(path);
            e.Result = path;
        }
        // Notify subscribers when the PDF is ready
        private void OnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            var path = e.Result as string;
            PdfGenerated?.Invoke(this, new PdfGeneratedEventArgs { FilePath = path });
        }
    }
    // 3. Program to wire it all together
    class Program
    {
        public static void Main(string[] args)
        {
            var generator = new PdfGenerator();
            // Subscribe to the PdfGenerated event
            generator.PdfGenerated += OnPdfGenerated;
            Console.WriteLine("Generating PDF asynchronously...");
            generator.GenerateAsync("<h1>Hello, IronPDF!</h1>", "output.pdf");
            Console.WriteLine("Press any key to exit after generation.");
            Console.ReadKey();
        }
        // Event handler for when the PDF is ready
        static void OnPdfGenerated(object sender, PdfGeneratedEventArgs e)
        {
            Console.WriteLine($"PDF generated at: {e.FilePath}");
        }
    }
}
Imports System
Imports System.ComponentModel
Imports IronPdf

Namespace IronPdfEventHandlerExample

    ' 1. Define custom EventArgs to carry event data
    Public Class PdfGeneratedEventArgs
        Inherits EventArgs

        Public Property FilePath As String
    End Class

    ' 2. Main class with event, BackgroundWorker, and logic
    Public Class PdfGenerator

        ' Declare the public event using EventHandler(Of T)
        Public Event PdfGenerated As EventHandler(Of PdfGeneratedEventArgs)
        Private ReadOnly _worker As BackgroundWorker

        Public Sub New()
            _worker = New BackgroundWorker()
            AddHandler _worker.DoWork, AddressOf OnDoWork
            AddHandler _worker.RunWorkerCompleted, AddressOf OnRunWorkerCompleted
        End Sub

        ' Start the async operation
        Public Sub GenerateAsync(html As String, outputPath As String)
            _worker.RunWorkerAsync(Tuple.Create(html, outputPath))
        End Sub

        ' Perform PDF generation in background
        Private Sub OnDoWork(sender As Object, e As DoWorkEventArgs)
            Dim args = DirectCast(e.Argument, Tuple(Of String, String))
            Dim html = args.Item1
            Dim path = args.Item2
            Dim renderer = New HtmlToPdf()
            Dim pdf = renderer.RenderHtmlAsPdf(html)
            pdf.SaveAs(path)
            e.Result = path
        End Sub

        ' Notify subscribers when the PDF is ready
        Private Sub OnRunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
            Dim path = TryCast(e.Result, String)
            RaiseEvent PdfGenerated(Me, New PdfGeneratedEventArgs With {.FilePath = path})
        End Sub
    End Class

    ' 3. Program to wire it all together
    Module Program

        Sub Main(args As String())
            Dim generator = New PdfGenerator()
            ' Subscribe to the PdfGenerated event
            AddHandler generator.PdfGenerated, AddressOf OnPdfGenerated
            Console.WriteLine("Generating PDF asynchronously...")
            generator.GenerateAsync("<h1>Hello, IronPDF!</h1>", "output.pdf")
            Console.WriteLine("Press any key to exit after generation.")
            Console.ReadKey()
        End Sub

        ' Event handler for when the PDF is ready
        Private Sub OnPdfGenerated(sender As Object, e As PdfGeneratedEventArgs)
            Console.WriteLine($"PDF generated at: {e.FilePath}")
        End Sub
    End Module

End Namespace
$vbLabelText   $csharpLabel

콘솔 출력

C# 이벤트 핸들러(개발자를 위한 동작 방식): 그림 1 - 콘솔 출력

PDF 출력

C# 이벤트 핸들러(개발자를 위한 동작 방식): 그림 2 - PDF 출력

이 코드의 주요 기능

  • public event EventHandler<PdfGeneratedEventArgs>: 강력한 형식의 이벤트 선언
  • PdfGeneratedEventArgs: 이벤트 데이터를 위한 사용자 정의 클래스
  • BackgroundWorker: UI 차단을 피하기 위한 비동기 실행 허용
  • ?.Invoke(...): 안전한 이벤트 호출
  • Tuple<string, string>: HTML과 출력 경로를 백그라운드 스레드로 전달

.NET에서 이벤트 작업을 위한 팁

1. UI 스레드 차단 방지

배경 작업이 완료된 후에만 UI를 업데이트하기 위해 RunWorkerCompleted와 같은 이벤트 핸들러를 사용하십시오.

2. 예외를 우아하게 처리

작업 논리를 DoWork 내부의 try-catch 블록에 감싸고 예외를 e.Error를 통해 RunWorkerCompleted에 전달하세요.

if (e.Error != null)
{
    MessageBox.Show("Error: " + e.Error.Message);
}
if (e.Error != null)
{
    MessageBox.Show("Error: " + e.Error.Message);
}
If e.Error IsNot Nothing Then
	MessageBox.Show("Error: " & e.Error.Message)
End If
$vbLabelText   $csharpLabel

3. 필요할 때 구독 취소

장시간 실행되는 앱에서는 메모리 누수를 방지하기 위해 필요하지 않을 때 이벤트 구독을 취소하세요:

pdfWorker.DoWork -= PdfWorker_DoWork;
pdfWorker.DoWork -= PdfWorker_DoWork;
pdfWorker.DoWork -= PdfWorker_DoWork
$vbLabelText   $csharpLabel

마지막으로

IronPDF와 이벤트 핸들러, 대리자 유형 및 이벤트 필드를 사용하면 .NET 애플리케이션에 반응적이고 현대적인 면모를 더할 수 있습니다. 기반 클래스에서 문서를 생성하든, 파생 클래스에서 재사용 가능한 논리를 생성하든, .NET의 이벤트 모델을 탐구하든 관계없이 이 패턴은 확장 가능하고 깔끔합니다.

이 접근 방식을 사용할 때

  • 작업이 완료되면 이벤트를 발생시키고 싶을 때
  • 논리와 UI 사이를 깔끔하게 분리해야 할 때
  • 당신은 BackgroundWorker, 이벤트, 및 대리자와 함께 작업 중입니다
  • C#의 정형 함수 포인터 메커니즘을 선호할 때

탐구할 대안

  • 새로운 워크플로를 위한 async/awaitTask.Run
  • 긴 작업 중 실시간 업데이트를 위한 IProgress<t>

IronPDF와 C# 이벤트를 결합하면 현실 세계의 사용성을 고려하여 강력하고 반응성이 뛰어난 PDF 생성 앱을 쉽게 만들 수 있습니다.

.NET 앱에서 이벤트 기반 PDF 생성을 구현할 준비가 되셨습니까? IronPDF 무료 체험판으로 시도하시고 원활하고 비차단적인 경험으로 사용자를 만족시키세요!

자주 묻는 질문

C#에서 HTML을 PDF로 변환하는 방법은 무엇인가요?

IronPDF의 RenderHtmlAsPdf 메서드를 사용하여 HTML 문자열을 PDF로 변환할 수 있습니다. 또한 RenderHtmlFileAsPdf 사용하여 HTML 파일을 PDF로 변환할 수도 있습니다.

.NET 애플리케이션에서 이벤트 기반 프로그래밍이 중요한 이유는 무엇입니까?

이벤트 기반 프로그래밍은 주 스레드를 막지 않고 비동기적으로 작업을 실행할 수 있어 반응성을 개선하고 부드러운 사용자 경험을 보장하기 때문에 .NET 애플리케이션에 필수적입니다.

.NET 프로젝트에 필요한 PDF 생성 도구를 어떻게 설치합니까?

패키지 관리자 콘솔에서 'Install-Package IronPdf' 명령을 실행하여 Visual Studio에서 NuGet을 통해 IronPDF를 설치할 수 있습니다.

C#에서 이벤트를 어떻게 선언합니까?

C#에서 이벤트는 'event' 키워드를 사용하여 선언되며, 종종 'EventHandler'와 같은 대리자 타입과 함께 사용됩니다. 예를 들어: public event EventHandler PdfGenerated;.

C# 이벤트 처리에서 대리자란 무엇입니까?

C#의 대리자는 이벤트에 응답하여 호출할 메소드를 정의할 수 있는 타입 안전 함수 포인터입니다.

C#에서 이벤트에 메소드를 어떻게 추가할 수 있습니까?

C#에서 '+=' 구문을 사용하여 실행 시간에 이벤트에 메소드를 동적으로 추가하여 이벤트에 구독할 수 있습니다.

사용자 지정 EventArgs 클래스를 만드는 목적은 무엇입니까?

사용자 지정 EventArgs 클래스는 파일 경로와 같은 이벤트 관련 데이터를 구조적이고 타입 안전한 방식으로 이벤트 핸들러에 전달하는 데 사용됩니다.

큰 PDF를 생성하기 위해 BackgroundWorker를 사용해야 하는 이유는 무엇입니까?

BackgroundWorker를 사용하면 PDF 생성 작업을 비동기적으로 실행하여 UI가 막히는 것을 방지하고 사용자 경험을 개선할 수 있습니다.

.NET에서 이벤트 작업에 대한 팁은 무엇입니까?

주요 팁에는 백그라운드 작업이 완료된 후에만 UI 업데이트하여 UI 스레드 차단을 방지하고, 예외를 우아하게 처리하며, 메모리 누수를 방지하기 위해 이벤트에서 더 이상 필요하지 않을 때 구독을 해제하는 것이 포함됩니다.

.NET에서 이벤트 핸들러 사용의 대안은 무엇입니까?

대안으로는 새로운 워크플로우에 대해 async/await와 Task.Run을 사용하고, 긴 작업 중 실시간 업데이트에 대해 IProgress를 사용하는 것이 포함됩니다.

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

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