.NET 幫助

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

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

在現代的網路和伺服器應用程式中,性能和可擴展性至關重要。 使用async 和 await 關鍵字在 C# 中進行非同步程式設計,讓開發人員能夠創建非阻塞、高度響應的應用程式。 當與強大的庫如 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
$vbLabelText   $csharpLabel

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

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

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

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

將 Async/Await 與 IronPDF 結合

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

IronPDF 概述

C# Async Await(如何運作於開發者):圖2

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

  • HTML 轉 PDF 轉換:IronPDF 可以將HTML內容(包括 CSS、圖像和 JavaScript)轉換成完整格式的 PDF。 這對於將動態網頁或報告渲染為PDF特別有用。
  • PDF 編輯:使用 IronPDF,您可以通過新增文字、圖片和圖形來操作現有的 PDF 文件,亦可編輯現有頁面的內容。
  • 文字及圖片擷取:此工具庫允許您從PDF中擷取文字及圖片,使解析和分析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
$vbLabelText   $csharpLabel

C# 非同步等待(開發人員如何使用):圖3

如何運作

  1. 建立 HTML 到 PDF 轉換器

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

    Async PDF Example

    "),但在實際應用中,這可以是動態的 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
$vbLabelText   $csharpLabel

C# 非同步等待(開發者如何運作):圖 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
$vbLabelText   $csharpLabel
  • 錯誤處理:如同任何非同步操作,確保對可能在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
$vbLabelText   $csharpLabel

結論

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

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

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# 事件(開發者如何運作)
下一個 >
C# 時間跨度格式(開發人員如何使用)