.NET 幫助

C# Async Await(對開發人員的運作原理)

發佈 2025年1月14日
分享:

利用非同步程式設計的強大功能來提高 .NET 應用程式中 PDF 處理的效能。

在現代的網路和伺服器應用程式中,性能和可擴展性至關重要。 使用 C# 進行非同步程式設計 async 和 await關鍵字允許開發人員創建非阻塞、高響應的應用程式。 當與強大的庫如 IronPDF 結合使用時,開發人員可以充分利用異步方法,特別是在處理像 PDF 生成和操作這樣的 I/O 密集型任務時。

在本文中,我們將探討如何使用非同步代碼進行編寫IronPDF比較同步編程和異步編程,並提供實際例子,例如 PDF 生成、文本提取和操作。 此外,我們將介紹處理多個任務的最佳實踐,並展示如何編寫代碼,使同步代碼和異步代碼無縫整合。

非同步程式設計介紹

在 C# 中的異步編程是一種重要的技術,使您的應用程式能夠在不阻塞主線程的情況下執行任務。 這對於處理長時間運行的操作特別有利,例如資料庫查詢、檔案輸入/輸出,或是生成或操作 PDF 檔案。

IronPDF 是一個強大的庫,可以簡化 .NET 應用程式中的 PDF 操作。 它允許進行各種 PDF 操作,從將 HTML 轉換為 PDF,到提取文字和圖像。 通過將IronPDF與異步編程模式集成,開發人員可以顯著提高處理PDF的應用程序性能。

了解 C# 中的 Async/Await

在深入了解如何在 IronPDF 中使用 async/await 之前,我們先快速看看這些關鍵字的作用以及它們在現代 .NET 開發中的重要性。

什麼是 Async/Await?

在 C# 中,async 和 await 關鍵字用於定義非同步方法。 非同步方法執行操作時不會阻塞應用程式主執行緒的執行,這使得應用程式在執行耗時任務時仍能保持回應。

  • async:此關鍵字用於預期執行非同步操作的方法。 這表明該方法至少包含一個 await 表達式。
  • await:此關鍵字用於暫停方法的執行,直到等待的任務完成。 它確保執行緒在等待操作完成時能夠執行其他任務。
public async Task WaitExampleAsync()
{
    await Task.Delay(1000); // Waits for 1 second without blocking the thread
    Console.WriteLine("Finished waiting asynchronously!");
}
public async Task WaitExampleAsync()
{
    await Task.Delay(1000); // Waits for 1 second without blocking the thread
    Console.WriteLine("Finished waiting asynchronously!");
}
Public Async Function WaitExampleAsync() As Task
	Await Task.Delay(1000) ' Waits for 1 second without blocking the thread
	Console.WriteLine("Finished waiting asynchronously!")
End Function
VB   C#

C# Async Await(開發者如何工作):圖1

非同步方法透過釋放主線程以處理其他操作,同時等待任務完成來提高響應能力。

異步編程的主要優勢

  • 非阻塞操作:使用異步編程,耗時操作(例如檔案 I/O 或網路請求)不要阻塞主線程。 這對於網路應用程式至關重要,因為非阻塞操作確保伺服器能夠同時處理多個請求。
  • 改良的可擴展性:async 關鍵字使應用程式能夠以較少的執行緒處理更多並發操作,提高了可擴展性。
  • 更好的使用者體驗:對於桌面或網頁應用程式,非同步操作確保當背景任務運行時,UI仍能對使用者輸入保持響應。

同步和非同步程式碼

了解何時使用同步程式設計與非同步程式設計對於高效應用程序設計至關重要。

  • 同步編程一次執行一個操作,會阻塞主線程直到操作完成。 例如,一個使用同步代碼生成 PDF 的方法可能如下所示:
public void GeneratePdfSync()
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf("<h1>Sync PDF</h1>");
    pdf.SaveAs("output.pdf");
}
public void GeneratePdfSync()
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    var pdf = renderer.RenderHtmlAsPdf("<h1>Sync PDF</h1>");
    pdf.SaveAs("output.pdf");
}
Public Sub GeneratePdfSync()
	Dim renderer As New ChromePdfRenderer()
	Dim pdf = renderer.RenderHtmlAsPdf("<h1>Sync PDF</h1>")
	pdf.SaveAs("output.pdf")
End Sub
VB   C#

雖然這種方法很簡單,但可能會導致性能瓶頸,特別是在處理多個任務的網絡應用程序或需要大量 I/O 的情況下。

  • 非同步程式設計允許操作在不阻塞主執行緒的情況下運行。 這對於像 PDF 生成這樣的 I/O 密集型任務特別有利,您可以使用非同步代碼來保持應用程序的響應性。

    在下一部分中,我們將探討如何將非同步編程與 IronPDF 結合,以提升您的 PDF 處理。

將 Async/Await 與 IronPDF 結合

IronPDF是一個強大的 .NET PDF 操作庫,旨在簡化處理 PDF 文件的工作。 它提供功能,使您能以最少的設置和編程努力生成、編輯和從 PDF 中提取內容。 當結合 C# 的 async/await 模式時,IronPDF 能夠以非阻塞的方式執行與 PDF 有關的操作,提高需要大量 PDF 處理的應用程式的性能和可擴展性。

IronPDF 概述

C# 非同步等待(開發者如何運作):圖 2

IronPDF允許 .NET 開發人員將 PDF 功能直接整合到其應用程式中,無論是用於網路還是桌面環境。 以下是IronPDF提供的一些主要功能:

  • HTML 轉換成 PDF:IronPDF 可以轉換HTML 內容 (包括 CSS、圖片和 JavaScript)轉換為完整格式的 PDF。 這對於將動態網頁或報告渲染為PDF特別有用。
  • PDF 編輯: 使用 IronPDF,您可以通過添加文字、圖片和圖形來操作現有的 PDF 文檔,以及编辑現有頁面的內容。
  • 文字和圖片提取:該函式庫允許您Extract text and images從 PDFs 中提取,使解析和分析 PDF 內容變得輕鬆。
  • 表單填寫:IronPDF 支援填寫表單欄位在 PDF 中,這對生成定制文件很有用。
  • 水印:也可以添加浮水印到 PDF 文件進行品牌或版權保護。

為什麼使用 IronPDF 與 Async/Await?

儘管IronPDF本身不是原生異步的,但由於大多數PDF處理任務的I/O受限性質,它非常適合於async/await模式。 例如,將 HTML 轉換為 PDF 或加載大型 PDF 文件可能需要較長的時間,但可以異步完成以避免阻塞主執行緒。

以下是 IronPDF 如何與異步編程完美結合的一些範例:

  • PDF 生成:如果您的應用程式需要根據動態內容生成多個 PDF,異步運行這些程序可以在創建 PDF 的同時保持系統的響應性。
  • PDF 操作:如果您需要修改大型 PDF,例如添加水印或合併文件,異步進行這些任務可以確保您的應用程式在這些耗時的操作在背景處理時不會掛起。
  • 檔案 I/O:讀取和寫入 PDF 是一種 I/O 操作。 非同步程式設計非常適合這些任務,因為它可以釋放系統資源並避免不必要的阻塞。

基本範例:使用 IronPDF 進行異步 PDF 生成

以下是使用 IronPDF 編寫異步代碼生成 PDF 文件的示例:

using IronPdf;
public class Program
{
    public static async Task Main(string[] args)
    {
        // Initialize renderer
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        // Use Task.Run to run the PDF generation asynchronously
        PdfDocument pdf = await Task.Run(() => renderer.RenderHtmlAsPdf("<h1>Async PDF Example</h1>"));
        // Save the generated PDF to a file
        await Task.Run(() => pdf.SaveAs("output.pdf"));
    }
}
using IronPdf;
public class Program
{
    public static async Task Main(string[] args)
    {
        // Initialize renderer
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        // Use Task.Run to run the PDF generation asynchronously
        PdfDocument pdf = await Task.Run(() => renderer.RenderHtmlAsPdf("<h1>Async PDF Example</h1>"));
        // Save the generated PDF to a file
        await Task.Run(() => pdf.SaveAs("output.pdf"));
    }
}
Imports IronPdf
Public Class Program
	Public Shared Async Function Main(ByVal args() As String) As Task
		' Initialize renderer
		Dim renderer As New ChromePdfRenderer()
		' Use Task.Run to run the PDF generation asynchronously
		Dim pdf As PdfDocument = Await Task.Run(Function() renderer.RenderHtmlAsPdf("<h1>Async PDF Example</h1>"))
		' Save the generated PDF to a file
		Await Task.Run(Function() pdf.SaveAs("output.pdf"))
	End Function
End Class
VB   C#

C# 異步等待(開發人員如何運作):圖 3

如何運作

  1. 創建 HTML 到 PDF 轉換器

    ChromePdfRenderer 類別用於將 HTML 內容轉換為 PDF。 在這個範例中,我們將簡單的 HTML 內容作為字串傳遞("

    異步 PDF 範例

    ")但在实际应用中,这可以是动态 HTML,例如报告模板。

  2. 使用 Task.Run 進行異步 PDF 生成

    RenderHtmlAsPdf 方法默認不是異步的,因此我們使用 Task.Run()將 PDF 生成分配給背景執行緒。 這很重要,因為生成 PDF 可能會消耗大量資源並且耗時,特別是在處理大型或複雜的文件時。

  3. 儲存 PDF

    PDF 生成後,使用 pdf.SaveAs 將其保存到文件系統中。(). 此 I/O 操作也被包裝在 Task.Run 中。()以確保在保存文件時不阻塞主執行緒。

  4. 待處理操作

    await 關鍵字確保每個非同步操作在下一個開始之前完成。 在等待 PDF 生成完成的同時,主執行緒仍然可以處理其他任務。(例如,在 Web 應用程式中負責其他 HTTP 請求的處理).

使用IronPDF處理多個任務

對於處理大型 PDF 的應用程式,您可能需要執行多個操作,如拆分、合併或向大型文件添加內容。 使用 async 能確保在一個操作處理的同時,應用程式保持對使用者輸入或請求的回應能力。

例如,您可以在管道中結合多個異步操作:

using IronPdf;
public class Program
{
    public static async Task Main(string[] args)
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument page = renderer.RenderHtmlAsPdf("<h1>Added Page</h1>");
        // Use Task.Run to run the PDF generation asynchronously
        PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("output.pdf"));
        // Perform some operations asynchronously
        await Task.Run(() => pdf.ApplyWatermark("Confidential"));
        PdfDocument merged = await Task.Run(() => PdfDocument.Merge(pdf, page));
        await Task.Run(() => merged.SaveAs("processed_output.pdf"));
    }
}
using IronPdf;
public class Program
{
    public static async Task Main(string[] args)
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument page = renderer.RenderHtmlAsPdf("<h1>Added Page</h1>");
        // Use Task.Run to run the PDF generation asynchronously
        PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("output.pdf"));
        // Perform some operations asynchronously
        await Task.Run(() => pdf.ApplyWatermark("Confidential"));
        PdfDocument merged = await Task.Run(() => PdfDocument.Merge(pdf, page));
        await Task.Run(() => merged.SaveAs("processed_output.pdf"));
    }
}
Imports IronPdf
Public Class Program
	Public Shared Async Function Main(ByVal args() As String) As Task
		Dim renderer As New ChromePdfRenderer()
		Dim page As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Added Page</h1>")
		' Use Task.Run to run the PDF generation asynchronously
		Dim pdf As PdfDocument = Await Task.Run(Function() PdfDocument.FromFile("output.pdf"))
		' Perform some operations asynchronously
		Await Task.Run(Function() pdf.ApplyWatermark("Confidential"))
		Dim merged As PdfDocument = Await Task.Run(Function() PdfDocument.Merge(pdf, page))
		Await Task.Run(Function() merged.SaveAs("processed_output.pdf"))
	End Function
End Class
VB   C#

C# Async Await(對開發人員的工作原理):圖4

在此範例中,我們加載一個 PDF 文件並創建一個新文件,添加浮水印,將兩個 PDF 合併在一起並保存,全部在不阻塞主線程的情況下完成。

IronPDF 非同步操作的最佳實踐

  • 線程池考量:由於IronPDF依賴背景線程進行處理,使用Task.Run時請注意線程池。(). 對於高頻率的任務,請考慮使用專用的背景服務或排隊任務以避免造成線程池過載。
  • 避免使用 async void 方法:對於執行非同步操作的方法,始終使用 async Task。 將異步 void 方法保留給事件處理程序。
  • 取消標記:對於像 PDF 生成或文本提取這樣長時間運行的操作,支持取消標記是個不錯的主意,以便在需要時允許用戶取消操作。 這確保如果不再需要操作,資源將被釋放。
public async Task GeneratePdfWithCancellationAsync(CancellationToken cancellationToken)
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf("<h1>Async PDF with Cancellation</h1>"), cancellationToken);
    if (cancellationToken.IsCancellationRequested)
    {
        Console.WriteLine("Operation was canceled.");
        return;
    }
    pdf.SaveAs("output.pdf");
}
public async Task GeneratePdfWithCancellationAsync(CancellationToken cancellationToken)
{
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf("<h1>Async PDF with Cancellation</h1>"), cancellationToken);
    if (cancellationToken.IsCancellationRequested)
    {
        Console.WriteLine("Operation was canceled.");
        return;
    }
    pdf.SaveAs("output.pdf");
}
Public Async Function GeneratePdfWithCancellationAsync(ByVal cancellationToken As CancellationToken) As Task
	Dim renderer As New ChromePdfRenderer()
	Dim pdf = Await Task.Run(Function() renderer.RenderHtmlAsPdf("<h1>Async PDF with Cancellation</h1>"), cancellationToken)
	If cancellationToken.IsCancellationRequested Then
		Console.WriteLine("Operation was canceled.")
		Return
	End If
	pdf.SaveAs("output.pdf")
End Function
VB   C#
  • 錯誤處理:與任何非同步操作一樣,請確保對在 PDF 處理期間可能發生的例外情況進行適當的錯誤處理,例如檔案訪問問題或無效的輸入資料。
try
{
    var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf("<h1>Async PDF</h1>"));
    pdf.SaveAs("output.pdf");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}
try
{
    var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf("<h1>Async PDF</h1>"));
    pdf.SaveAs("output.pdf");
}
catch (Exception ex)
{
    Console.WriteLine($"Error: {ex.Message}");
}
Try
	Dim pdf = Await Task.Run(Function() renderer.RenderHtmlAsPdf("<h1>Async PDF</h1>"))
	pdf.SaveAs("output.pdf")
Catch ex As Exception
	Console.WriteLine($"Error: {ex.Message}")
End Try
VB   C#

結論

IronPDF是一個多功能且強大的 PDF 操作庫,與 C# 的 async/await 模式配合得非常好。 透過使用 IronPDF 的非同步程式設計,您可以顯著改善處理 PDF 生成和操作的 .NET 應用程式的性能和可擴展性。 無論是生成動態報告、從文件中提取數據,還是編輯 PDF,IronPDF 與異步程序設計的無縫整合都使其成為現代 .NET 開發人員的出色選擇。

不要忘記探索IronPDF 的免費試用,可提供所有功能的訪問,讓您可以在自己的專案中測試這些功能。 通過將異步操作整合至IronPDF中,您將能夠建立更快速、更高效的應用程式,並能夠更好地隨著工作負載的增加而擴展。

< 上一頁
C# 事件(開發者如何運作)
下一個 >
C# 時間跨度格式(開發人員如何使用)