.NET 幫助

C# ConfigureAwait(它如何為開發人員工作)

發佈 2024年10月24日
分享:

作為開發人員,非同步編程可以帶來極大的好處,它可以提升應用程式的性能、效率和響應能力,特別是那些涉及需要不定時間才能完成的操作的應用程式。 使用`ConfigureAwait(錯誤)`,您可以在某些情境下避免死鎖。 在異步程式設計中,當存在同步上下文時會發生死結。(例如桌面應用程式中的 UI 執行緒)期望在繼續之前完成操作。 不過,仍需等待同步上下文可用,這會導致一個循環等待。

今天,我們將探討如何ConfigureAwait可以與 IronPDF 一起使用,以透過異步編程高效地執行 PDF 處理任務。 IronPDF 是一個 .NET PDF 庫,使與 PDF 相關的任務變得輕而易舉。 擁有強大的功能集,良好的跨平台兼容性和廣泛的文檔,它是一個值得擁有的強大 PDF 工具,在您的開發工具箱中必不可少。

理解 C# 中的異步編程

什麼是非同步程式設計?

非同步程式設計是指撰寫程式碼的一種方法,使某些操作能夠獨立於主應用程式執行緒運行。 這對於需要等待的長時間任務很有用,例如 I/O 操作。 通過允許這些任務在不阻塞主線程的情況下運行,應用程式可以在這些任務需要時間完成的同時繼續運行,最終提高應用程式的性能和響應速度。

在非同步程式碼中 ConfigureAwait 的角色

ConfigureAwait 是非同步程式設計中的一個方法,用於控制續航是如何執行的。 繼續是等待表達式之後運行的代碼,默認情況下,**await** 會捕獲當前上下文並嘗試將繼續操作調度回到該上下文,這可能會低效。ConfigureAwait 允許您指定繼續操作是否應在捕獲的上下文中運行,指示為 **ConfigureAwait**。(真)` 或不,這取決於 `ConfigureAwait(錯誤)**`.

使用 `**ConfigureAwait(錯誤)`有助於避免死鎖,這是因為當你使用它時,你告訴任務不要捕捉當前的同步上下文,也不要嘗試在原始上下文上恢復。 這樣就允許續集在線程池線程而不是原始上下文中運行,從而防止主線程被阻塞。

`ConfigureAwait(錯誤)` 在庫程式碼中或在恢復原始上下文不必要的情況下特別有用,從而確保代碼保持靈活且無死鎖。

如何使用ConfigureAwait與IronPDF一起配置

在你的.NET專案中設置IronPDF

若要在您的 .NET 專案中開始使用 IronPDF,請首先安裝IronPDF NuGet 套件. 您可以藉由導航至工具 > NuGet 套件管理員 > 解決方案的 NuGet 套件管理員,並搜尋 IronPDF 來完成此操作:

C# ConfigureAwait(開發者如何使用):圖1

或者,在套件管理控制台中執行以下命令:

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
VB   C#

要在程式碼中開始使用IronPDF,請確保您已將`using IronPdf`語句放在程式碼檔案的頂部。如需有關在您的環境中設置IronPDF的更深入指南,請查看其開始使用頁面。

使用 IronPDF 非同步生成 PDF 文件

異步生成 PDF 文件在需要生成大量 PDF 文件或想同時執行多個操作的情況下尤其有利。 使用IronPDF,您可以非同步地執行與PDF相關的任務,其可能看起來像以下這段非同步程式碼:

using IronPdf;
using System.Threading.Tasks;
class program
{
    static async Task Main(string[] args)
    {
        await GeneratePdfAsync();
    }
    static async Task GeneratePdfAsync()
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        string htmlContent = "<h1>Hello World!</h1>";
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);
        await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));
        Console.WriteLine("Working!");
    }
}
using IronPdf;
using System.Threading.Tasks;
class program
{
    static async Task Main(string[] args)
    {
        await GeneratePdfAsync();
    }
    static async Task GeneratePdfAsync()
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        string htmlContent = "<h1>Hello World!</h1>";
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);
        await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));
        Console.WriteLine("Working!");
    }
}
Imports IronPdf
Imports System.Threading.Tasks
Friend Class program
	Shared Async Function Main(ByVal args() As String) As Task
		Await GeneratePdfAsync()
	End Function
	Private Shared Async Function GeneratePdfAsync() As Task
		Dim renderer As New ChromePdfRenderer()
		Dim htmlContent As String = "<h1>Hello World!</h1>"
		Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync(htmlContent)
		Await Task.Run(Function() pdf.SaveAs("outputAsync.pdf"))
		Console.WriteLine("Working!")
	End Function
End Class
VB   C#

在這段程式碼中,我們在 GeneratePdfAsync 中異步建立了一個 PDF 文件。()** 方法。 ChromePdfRenderer用於創建從 HTML 內容生成 PDF 文件所必需的渲染器。 這PdfDocument類別用於從提供的內容創建 PDF。HTML 字串,然而,您也可以使用它從一個創建 PDF。HTML 文件, 網址, 影像,以及更多。 要了解有關使用 IronPDF 生成 PDF 的不同方法的更多信息,請查看如何指導部分在生成PDF檔案方面。

異步處理大型 PDF 文件

處理大型 PDF 檔案時,使用異步方法搭配 `ConfigureAwait(錯誤)` 能夠顯著提高性能,因為在繁重的操作期間可以釋放主線程。 在此範例中,我拿了一個大型 PDF 文件並進行了文字提取任務以展示非同步 PDF 處理的好處。

using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class Program
{
    static async Task Main(string[] args)
    {
        await LongPdfTask();
    }
    static async Task LongPdfTask()
    {
        try
        {
            // Initialize IronPDF's PdfDocument
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);
            // Extract text from PDF asynchronously
            string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);
            // Write the extracted text to a file asynchronously
            await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);
            Console.WriteLine("Extraction complete!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in GeneratePdfAsync: {ex.Message}");
        }
    }
}
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class Program
{
    static async Task Main(string[] args)
    {
        await LongPdfTask();
    }
    static async Task LongPdfTask()
    {
        try
        {
            // Initialize IronPDF's PdfDocument
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);
            // Extract text from PDF asynchronously
            string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);
            // Write the extracted text to a file asynchronously
            await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);
            Console.WriteLine("Extraction complete!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error in GeneratePdfAsync: {ex.Message}");
        }
    }
}
Imports IronPdf
Imports System.Threading.Tasks
Imports System.IO
Imports System
Friend Class Program
	Shared Async Function Main(ByVal args() As String) As Task
		Await LongPdfTask()
	End Function
	Private Shared Async Function LongPdfTask() As Task
		Try
			' Initialize IronPDF's PdfDocument
			Dim pdf As PdfDocument = Await Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(False)
			' Extract text from PDF asynchronously
			Dim text As String = Await Task.Run(Function() pdf.ExtractAllText()).ConfigureAwait(False)
			' Write the extracted text to a file asynchronously
			Await Task.Run(Sub() File.WriteAllText("extractedText.txt", text)).ConfigureAwait(False)
			Console.WriteLine("Extraction complete!")
		Catch ex As Exception
			Console.WriteLine($"Error in GeneratePdfAsync: {ex.Message}")
		End Try
	End Function
End Class
VB   C#

在上述代碼中,`ConfigureAwait(錯誤)` 用於執行從大型 PDF 文件中提取所有文本的耗時任務,我們的情況是超過 200 頁長。

  • 導入與設置: 我們程式碼頂部的第一部分專門用於導入必要的庫和命名空間。 您需要確保使用 `using IronPdf` 以使用 IronPDF 程式庫。
  • 類別和主方法: `class Program` 定義了包含此專案主要應用程式程式碼的類別。 `static async Task Main(字串[]參數)` 是應用程式的入口點。 在這裡,我們將其標記為async,因此我們的異步操作可以在其中運行。 然後,我們使用 await LongPdfTask()** 以非同步方式呼叫 LongPdfTask 方法。
  • 嘗試區塊: 我已將代碼包裹在 LongPdfTask 方法內的 try-catch 區塊中,以優雅地處理任何意外的例外情況。
  • PdfDocument PDF = await Task.Run(()=> PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(錯誤): 此行可以分為三個不同的部分:
  • PdfDocument.FromFile("Sample.pdf"): 此部分會同步地將指定的 PDF 檔案載入至IronPdf.PdfDocument物件。
  • await Task.Run(()=> ...): 在單獨的執行緒上運行 PDF 加載操作,以避免阻塞主執行緒。 這使其成為非同步操作。
  • **.ConfigureAwait(錯誤)避免捕捉當前上下文,這應該能提升性能並減少死鎖。
  • 字串 text = await Task.Run(()=> pdf.ExtractAllText()).ConfigureAwait(錯誤)這將執行IronPDF 文字提取方法,ExtractAllText(). 再次,await Task.Run(()=> ...) 用於在單獨的執行緒上異步運行此操作。
  • await Task.Run(()=> File.WriteAllText("extractedText.txt",文字)).ConfigureAwait(錯誤): 接著,我們利用 await Task 方法,再次將提取的文本異步寫入 .txt 文件中。

之前

C# ConfigureAwait(開發人員如何使用):圖2

輸出

C# ConfigureAwait(對開發者的運作方式):圖3

在 .NET 應用程式中使用 ConfigureAwait 的最佳實踐

何时使用 ConfigureAwait(真) 与 ConfigureAwait(錯誤)

ConfigureAwait(錯誤) 最適用於您在庫代碼或背景處理中工作時,不需要保留同步上下文的情況。 通常,這是用於伺服器端程式碼,性能至關重要。 使用 ConfigureAwait(錯誤)意味著當await**操作完成時,後續操作不一定在啟動異步操作的同一線程上運行。

當涉及到 PDF 處理時,實作 ConfigureAwait(錯誤) 可以幫助在運行多個 PDF 處理任務時最大化性能,以避免與上下文切換相關的瓶頸。 它還可以在處理大量 PDF 文件時幫助應用程式順利運行,並幫助在您工作於控制台應用程式或背景服務中時維持效率,而在此情況下的上下文切換可能是不必要的。

ConfigureAwait(真) 最適用於 UI、任何單元測試或必須在相同上下文中繼續運行的 ASP.NET 應用程式中,雖然如果使用不當可能會導致死鎖。 例如,如果您正在更新 UI 或存取 httpcontext). ConfigureAwait(真)默認行為是 ,也可以僅寫作 ConfigureAwait

當用於 PDF 處理任務時,特別是在您的 PDF 處理代碼與 UI 緊密集成的情況下,這可能尤其有利。(當使用像 WPF、WinForms 等的 UI 應用程式時),例如顯示進度,您需要捕獲同步上下文以確保這些更新發生在 UI 執行緒上。 這對於需要由於執行緒關聯性要求必須在特定執行緒上執行的執行緒敏感操作也是有益的。

在非同步 IronPDF 操作中處理例外狀況

在異步編程中處理異常是一個需要注意的重要方面,需要小心考慮,未處理的異常可能會終止應用程式。 在異步代碼周圍使用 try-catch 區塊是優雅處理任何意外異常的好方法。

例如:

public async Task SafeGeneratePdfAsync()
{
    try
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);
        await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
public async Task SafeGeneratePdfAsync()
{
    try
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);
        await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
Public Async Function SafeGeneratePdfAsync() As Task
	Try
		Dim renderer As New ChromePdfRenderer()
		Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(False)
		Await Task.Run(Function() pdf.SaveAs("output.pdf")).ConfigureAwait(False)
	Catch ex As Exception
		Console.WriteLine($"An error occurred: {ex.Message}")
	End Try
End Function
VB   C#

在使用延續任務時,使用 `ConfigureAwait(錯誤)`,如果使用 Task.ContinueWith,例外情況可以通過在延續中使用 try-catch 處理,或者通過 Task.Exception 屬性處理。

您可以編寫代碼來執行此操作的示例如下所示:

class program
{
    public static async Task Main(string[] args)
    {
        await ProcessPdfWithContinuationAsync();
    }
    static Task ProcessPdfWithContinuationAsync()
    {
        return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
            .ContinueWith(pdfTask =>
            {
                if (pdfTask.IsFaulted)
                {
                    // Handle exceptions from loading the PDF
                    Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
                    return;
                }
                var pdf = pdfTask.Result;
                // Extract text asynchronously with exception handling
                Task.Run(() => pdf.ExtractAllText())
                    .ContinueWith(extractTask =>
                    {
                        if (extractTask.IsFaulted)
                        {
                            // Handle exceptions from extracting text
                            Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
                            return;
                        }
                        // Proceed if text extraction is successful
                        Console.WriteLine("Extracted text:");
                        Console.WriteLine(extractTask.Result);
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
    }
class program
{
    public static async Task Main(string[] args)
    {
        await ProcessPdfWithContinuationAsync();
    }
    static Task ProcessPdfWithContinuationAsync()
    {
        return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
            .ContinueWith(pdfTask =>
            {
                if (pdfTask.IsFaulted)
                {
                    // Handle exceptions from loading the PDF
                    Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
                    return;
                }
                var pdf = pdfTask.Result;
                // Extract text asynchronously with exception handling
                Task.Run(() => pdf.ExtractAllText())
                    .ContinueWith(extractTask =>
                    {
                        if (extractTask.IsFaulted)
                        {
                            // Handle exceptions from extracting text
                            Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
                            return;
                        }
                        // Proceed if text extraction is successful
                        Console.WriteLine("Extracted text:");
                        Console.WriteLine(extractTask.Result);
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);
    }
Friend Class program
	Public Shared Async Function Main(ByVal args() As String) As Task
		Await ProcessPdfWithContinuationAsync()
	End Function
	Private Shared Function ProcessPdfWithContinuationAsync() As Task
		Return Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ContinueWith(Sub(pdfTask)
				If pdfTask.IsFaulted Then
					' Handle exceptions from loading the PDF
					Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}")
					Return
				End If
				Dim pdf = pdfTask.Result
				' Extract text asynchronously with exception handling
				Task.Run(Function() pdf.ExtractAllText()).ContinueWith(Sub(extractTask)
						If extractTask.IsFaulted Then
							' Handle exceptions from extracting text
							Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}")
							Return
						End If
						' Proceed if text extraction is successful
						Console.WriteLine("Extracted text:")
						Console.WriteLine(extractTask.Result)
				End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
		End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
	End Function
VB   C#

為何選擇IronPDF來滿足您的PDF處理需求?

IronPDF 的主要功能和優勢

C# ConfigureAwait(它對開發者的運作方式):圖 4

IronPDF 是一個功能強大的 C# PDF 函式庫,提供豐富的功能集以滿足您所有與 PDF 相關的任務。 全力支援 .NET 8、7、6、.NET Core、Standard 和 Framework,並能在多種應用環境中運行,如 Windows、Linux、Mac、Docker、Azure 和 AWS,無論您偏好的環境是什麼,您都能充分利用 IronPDF。

使用 IronPDF,您可以從各種文件和數據類型生成 PDF;包括HTML 文件, HTML 字串, 網址, 圖像, DOCX,和RTF,只需幾行程式碼即可完成! 它可以處理 PDF 文件的格式,應用自訂浮水印, 合併和分割PDF檔案,處理PDF 加密安全性,以及更多。

IronPDF 對非同步程式設計的支援

IronPDF 提供許多操作的非同步方法,使開發者能夠無縫地利用 async/await 模式。 這種支持確保了IronPDF可以被整合到性能關鍵的應用中而不影響響應速度,使其成為在異步環境中從事PDF相關任務的開發人員不可或缺的PDF工具。

授權

如果您想親自試用IronPDF並探索其廣泛的功能,您可以藉由其輕鬆做到這一點。免費試用期。 安裝快速且簡便,您可以在短時間內將 IronPDF 應用於您的 PDF 項目中。想繼續使用它並利用其強大的功能提升您的 PDF 技術嗎? 授權條款只需 $749 起,並附有慷慨的 30 天退款保證、全年產品支持和更新,並以永久授權提供。(所以沒有令人煩惱的經常性費用!)

C# ConfigureAwait(開發者如何運作):圖 5

範例:使用 ConfigureAwait 和 IronPDF 進行 PDF 生成

為了非同步生成 PDF,我們將使用 IronPDF 執行程式碼來渲染 HTML 檔案,並使用 **ConfigureAwait 儲存結果。(錯誤)以確保延續過程中不會不必要地切換回原始同步上下文。

using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }
    static async Task<string> CreateInvoicePdfAsync()
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);
            return filePath;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }
    static async Task<string> CreateInvoicePdfAsync()
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);
            return filePath;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
Imports IronPdf
Imports System.Threading.Tasks
Imports System.IO
Imports System
Friend Class program
	Public Shared Async Function Main(ByVal args() As String) As Task
		Await CreateInvoicePdfAsync()
	End Function
	Private Shared Async Function CreateInvoicePdfAsync() As Task(Of String)
		Dim renderer As New ChromePdfRenderer()
		Try
			Dim pdf = Await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(False)
			Await Task.Run(Function() pdf.SaveAs("invoice.pdf")).ConfigureAwait(False)
			Return filePath
		Catch ex As Exception
			Console.WriteLine($"Error generating PDF: {ex.Message}")
			Return Nothing
		End Try
	End Function
End Class
VB   C#

在此範例中,我們使用的是我們創建的非同步方法,static async TaskCreateInvoicePdfAsync(),從所提供的 HTML 檔案生成 PDF 發票RenderHtmlFileAsPdfAsync方法。 我們已經使用了 ConfigureAwait(錯誤) 防止此任務在原始同步上下文中繼續,以提升我們非UI應用程式的性能。

我們還實施了 await Task.Run())=> ...) 方法再次異步執行操作。 最後,我們使用 pdf.SaveAs 方法將新生成的 PDF 文件保存為「invoice.pdf」。 整個程式碼在 CreateInvoicePdfAsync() 方法已包裹在 try-catch 區塊中,以處理任何意外的例外情況。

HTML檔案

C# ConfigureAwait(開發人員如何使用):圖 6

輸出

C# ConfigureAwait(開發人員如何運作):圖 7

正如您所見,我們已成功將 HTML 文件異步生成 PDF,並且它為我們創建了一個清晰、高品質的 PDF 文件。

結論

非同步程式設計對於構建響應迅速且高效的 .NET 應用程式至關重要,使用ConfigureAwait正確地使用可以幫助您實現最佳效能,特別是在撰寫應用層級程式碼時。 在使用IronPDF,利用非同步方法結合 ConfigureAwait(錯誤) 確保您的 PDF 處理任務不會阻塞主執行緒,提高應用程式的整體響應能力。 通過了解何時及如何使用ConfigureAwait**,您可以使您的IronPDF PDF處理任務更加穩健且性能友好。

如今,你可以在異步編程中與IronPDF一起專業使用ConfigureAwait,那你還在等什麼? 立即嘗試使用 IronPDF,看看它如何提升您的 PDF 相關專案。! 如果您想了解更多有關IronPDF作為強大通用程式庫代碼所提供的廣泛功能,請務必查看其便利的使用手冊。操作指南. 或者,如果您想了解更多關於將 IronPDF 與異步編程方法一起使用的信息,或者只是想了解更多有關 IronPDF 的一般信息,請查看我們的博客文章. 如果您正在尋找更多異步 PDF 生成範例,請查看我們的C# 等待秒數發文,或者我們的另一篇文章在C# Task.Run.

< 上一頁
Azure Tables(對開發人員的運作方式)
下一個 >
C# 可空類型 (開發者如何使用)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >