Altbilgi içeriğine atla
.NET YARDıM

C# Olay Yöneticisi (Geliştiriciler için Nasıl Çalışır)

Modern .NET uygulamalarda, olay odaklı programlama, yanıt verirliğin artırılmasında ve sorunsuz kullanıcı deneyimlerinin sağlanmasında önemli bir rol oynamaktadır. PDF oluşturma gibi görevler zaman aldığında, ana iş parçacığını engellemek istemezsiniz. Bunun yerine, görevleri asenkron olarak yürütmek ve bir olay meydana geldiğinde tepki vermek için olay işleyicileri kullanabilirsiniz. Bu, uygulamanızı daha etkileşimli ve duyarlı hale getirir.

Bu kılavuzda, masaüstü ve web ortamlarında sorunsuz PDF iş akışları için IronPDF ile C# olay işleme yöntemlerini nasıl entegre edeceğinizi göstereceğiz. İster WinForms, WPF kullanın, ister başka bir C# programlama dili tabanlı platform kullanıyor olun, bu kılavuz sizin için var.

IronPDF Projenizi Kurma

Olayları ele almadan önce, .NET projenizde IronPDF'i hızlı bir şekilde kurmamıza izin verin.

NuGet ile IronPDF Kurulumu

Visual Studio Paket Yönetici Konsolu'nda çalıştırın:

Install-Package IronPdf

IronPDF kullanarak PDF oluşturmak için gereken her şeyi yükler.

IronPDF ile Temel PDF Oluşturma

IronPDF'ın çalıştığından emin olmak için hızlı bir örnek:

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

Bu çalıştığında, olay alanları ekleyebilir, kayıtlı delegeleri bağlayabilir ve olay odaklı iş akışları oluşturmak için delege türlerini kullanabilirsiniz.

.NET Geliştiricileri için C# Olay İşleyici Temelleri

Olay Odaklı Programlamanın Temelleri

Olay odaklı programlama ile uygulamanız bir olay meydana geldiğinde yanıt verir, örneğin bir PDF'nin oluşturulmasını tamamladığında. C#, tür güvenli işlev göstericileri olarak delegeleri kullanır ve uygulamanızın nasıl tepki vermesi gerektiğini tanımlamanıza olanak sağlar.

Genellikle olayları event anahtar kelimesi kullanarak ilan eder, olay işleme yöntemlerine bağlar ve özel EventArgs alt sınıflarını kullanarak veri iletirsiniz.

Event Anahtar Kelimesi ile Olay İlan Etme

C#, event üyelerini ilan etmek için event anahtar kelimesini kullanır. Örneğin:

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

Bu satır, PdfGenerated adında bir olay alanı ilan eder. Bu olay, olaylar için .NET'te adlandırma deseni olarak bilinen şu parametre listesine sahip yerleşik bir delege olan EventHandler kullanır: (object sender, EventArgs e).

C#'da Olayları Tanımlama ve Abone Olma

Delegeler Kullanarak Olaylara Metod Ekleme

C# olayları, çalışma saatinde dinamively yöntem eklemeyi += syntax aracılığıyla destekler. İşte nasıl yapılacağı:

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

Bu abone sınıfı, PdfGenerated olayını dinler ve tetiklendiğinde bir yöntem çağrısı yapar.

Özel Olay Verileri

Oluşturulan dosya yolu gibi olay verilerini iletmek için EventArgs sınıfından türetilmiş bir sınıf tanımlayın:

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

Daha sonra olayı, generic delege türü kullanarak yeniden tanımlayın:

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

Bu size, olay tetiklendiğinde güçlü, tür güvenli veriler sağlar ve tepki mantığınızı daha güçlü kılar.

Birden Çok Olayı Ele Alma

Birden çok olay tanımlayabilirsiniz:

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

Her olay alanı, bir abone sınıfı tarafından ele alınır, böylece her aşama için farklı olay işleyici yöntemleri sağlayabilirsiniz. Bu, karmaşık iş akışlarında mantıklı bir ayrım sağlar.

IronPDF ile Olay İşleyicileri Kullanma

Büyük PDF'ler oluştururken, IronPDF'i bir arka plan iş parçacığında çalıştırmak ve tamamlandığında kullanıcı arayüzüne bildirmek mantıklıdır. İşte olay odaklı tasarımın nasıl yardımcı olabileceği:

  • PDF'leri asenkron olarak oluşturmak için bir BackgroundWorker kullanın
  • Her aşama tamamlandığında olayları tetikleyin
  • Sonuç verilerini olay verisi nesneleri aracılığıyla iletin

Kod Örneği – PDF'leri Asenkron Olarak Oluşturma

Aşağıdaki örnek, IronPDF ile olay işleme kullanımına dair tam kodu göstermektedir:

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

Konsol Çıkışı

C# Olay İşleyicisi (Geliştiriciler İçin Nasıl Çalışır): Şekil 1 - Konsol Çıkışı

PDF Çıktısı

C# Olay İşleyicisi (Geliştiriciler İçin Nasıl Çalışır): Şekil 2 - PDF çıktısı

Bu Koddaki Ana Özellikler

  • public event EventHandler<PdfGeneratedEventArgs>: Güçlü tipte bir olayı bildirir
  • PdfGeneratedEventArgs: Olay verisi için özel sınıf
  • BackgroundWorker: UI tıkanıklığını önlemek için async yürütmeye izin verir
  • ?.Invoke(...): Güvenli olay çağrısı
  • Tuple<string, string>: Arka plan iş parçacığına HTML ve çıktı yolunu iletir

.NET'te Olaylarla Çalışmak İçin İpuçları

1. UI Is Parcacığını Engellemeyin

Arka plan görevlerinin tamamlanmasının ardından yalnızca RunWorkerCompleted gibi olay işleyicilerini kullanarak UI güncellemeleri yapın.

2. İstisna Durumlarını Zarifçe Ele Alın

İş mantığınızı DoWork içine try-catch bloklarına sarın ve RunWorkerCompleted'e e.Error aracılığıyla istisnalar iletin.

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. Gerekli Olduğunda Abonelikten Çıkın

Uzun süren uygulamalarda, bellek sızıntılarını önlemek için artık ihtiyaç duymadığınız olaylardan abonelikten çıkın:

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

Son Düşünceler

Olay işleyicilerini, delege türlerini ve olay alanlarını IronPDF ile kullanmak, .NET uygulamalarına duyarlı, modern bir estetik katıyor. İster belgeleri bir temel sınıf içinde oluşturun, ister türetilmiş sınıflarda yeniden kullanılabilir mantıklar oluşturun ya da .NET'in olay modelini keşfedin, bu desen ölçeklenebilir ve temizdir.

Bu Yöntemi Ne Zaman Kullanmalı

  • Bir görevin tamamlanmasını olay yükselterek işaretlemek istiyorsanız
  • Mantık ve UI arasında temiz bir ayrım ihtiyacınız varsa
  • BackgroundWorker, olaylar ve delege ile çalışıyorsunuz
  • C#'ın tür güvenli işlem noktası mekaniklerini tercih ediyorsanız

Kefşetmek için Alternatifler

  • Yeni iş akışları için async/await ve Task.Run
  • Uzun işlemler sırasında gerçek zamanlı güncellemeler için IProgress<t>, IronPDF, C# olaylarıyla birleştirildiğinde güçlü ve duyarlı PDF oluşturan uygulamaları, gerçek dünya kullanımı düşünülerek basit hale getirir. .NET uygulamanızda olay odaklı PDF oluşturmayı uygulamaya hazır mısınız? Kullanıcılarınızı sorunsuz, kesintisiz deneyimlerle mutlu etmek için bir IronPDF ücretsiz denemesi ile deneyin!

Sıkça Sorulan Sorular

HTML'yi C# içerisinde PDF'ye nasıl dönüştürebilirim?

HTML dizgilerini PDF'lere dönüştürmek için IronPDF'ün RenderHtmlAsPdf yöntemini kullanabilirsiniz. Ayrıca, HTML dosyalarını RenderHtmlFileAsPdf kullanarak PDF'lere dönüştürebilirsiniz.

.NET uygulamalarında olay tabanlı programlama neden önemlidir?

.NET uygulamalarında, ana iş parçacığını engellemeden görevlerin eşzamansız olarak çalışmasına izin vererek, duyarlılığı artırmak ve kesintisiz kullanıcı deneyimleri sağlamak için olay tabanlı programlama hayatidir.

.NET projesinde gerekli PDF oluşturma aracını nasıl yüklersiniz?

Visual Studio’nun Paket Yöneticisi Konsolunda 'Install-Package IronPdf' komutunu çalıştırarak IronPDF'yi NuGet üzerinden yükleyebilirsiniz.

C#'ta bir olayı nasıl bildirirsiniz?

C#'ta olaylar genellikle 'EventHandler' gibi bir delege tipi ile 'event' anahtar kelimesi kullanılarak bildirilir. Örneğin: public event EventHandler PdfGenerated;.

C# olay işleme içerisinde delege nedir?

C#'ta delege, bir olaya yanıt olarak çağrılabilecek yöntemleri tanımlamanıza izin veren, tür güvenliği sağlayan bir işlev işaretçisidir.

C#'ta olaylara nasıl yöntemler eklenir?

C#'ta olaylara yöntemler dinamik olarak çalışma zamanında '+=' söz dizimi ile olaylara abone olarak eklenebilir.

Özel bir EventArgs sınıfı oluşturmaktaki amaç nedir?

Özel bir EventArgs sınıfı, olay işleyicilerine bir dosya yolu gibi olay özelliğindeki verileri yapısal ve tür güvenli bir şekilde iletmek için kullanılır.

Neden büyük PDF'leri oluşturmak için bir BackgroundWorker kullanmalısınız?

BackgroundWorker kullanmak, PDF oluşturma görevlerini eşzamansız olarak çalıştırarak UI’nın bloke olmasını önler ve kullanıcı deneyimini geliştirir.

.NET'te olaylarla çalışmaya dair bazı ipuçları nelerdir?

Anahtar ipuçları, arka plan görevleri tamamlandıktan sonra yalnızca UI’yi güncelleyerek UI iş parçacığı blokajından kaçınmayı, hataları zarif bir şekilde ele almayı ve bellek sızıntılarını önlemek için artık ihtiyaç duyulmadığında olaylardan abonelikleri kaldırmayı içerir.

.NET'te olay işleyicilerinin kullanımına alternatifler nelerdir?

Alternatifler arasında daha yeni iş akışları için async/await ve Task.Run kullanma ve uzun işlemler sırasında gerçek zamanlı güncellemeler için IProgress yer alır.

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Teknoloji Direktörü

Jacob Mellor, Iron Software'de Baş Teknoloji Yöneticisidir ve C# PDF teknolojisinde öncü bir mühendisdir. Iron Software'ın ana kod tabanının ilk geliştiricisi olarak, CEO Cameron Rimington ile birlikte şirketin ürün mimarisini 50'den fazla kişilik bir şirkete dönüştürmüştür ...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara