跳過到頁腳內容
.NET幫助

C# ConfigureAwait(對開發者如何理解的工作)

作為一名開發者,非同步編程極具優勢,它可以提高您的應用程式的性能、效能和回應性,特別是那些涉及需要不確定時間才能完成的操作的應用程式。 藉由使用ConfigureAwait(false),您能避免在某些場景中出現死鎖。 當有同步上下文(如桌面應用程式中的UI執行緒)需要某個操作完成後才能繼續時,死鎖會在非同步編程中發生。 然而,await的任務正等待同步上下文可用,從而產生環狀等待。

今天,我們將探討如何使用ConfigureAwait搭配IronPDF,在非同步編程中高效地執行PDF處理任務。 IronPDF是一個.NET的PDF程式庫,它讓處理與PDF相關的任務變得輕而易舉。 憑藉強大的功能集、強大的跨平台兼容性和豐富的文件資料,它是一個在您開發者工具包中必備的強大PDF工具。

Understanding Asynchronous Programming in C#

什麼是非同步編程?

非同步編程指的是一種寫程式碼的方法,允許某些操作獨立於主應用程式執行緒執行。 這對於需要等待的長時間運行的任務(如I/O操作)特別有用。 允許這些任務在不阻塞主執行緒的情況下運行,應用程式可以在這些任務需要一定時間完成時繼續運行,從而最終提高應用程式的性能和回應速度。

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

ConfigureAwait是一種在非同步編程中用於控制如何執行連續操作的方法。 連續操作是await表達式之後運行的程式碼,預設情況下ConfigureAwait(false)

使用ConfigureAwait(false)可以避免死鎖,因為當您使用它時,您是在告訴任務不要捕捉當前同步上下文,也不應該試圖在原始上下文中恢復。 這樣就可以讓連續操作在執行緒池執行緒上運行,而不是原始上下文上,從而防止主執行緒被阻塞。

ConfigureAwait(false)特別適用於程式庫程式碼或在不需要恢復到原上下文的情況下確保程式碼保持彈性且無死鎖。

如何在您.NET專案中使用ConfigureAwait搭配IronPDF

在.NET專案中設置IronPDF

要在您的.NET專案中開始使用IronPDF,請首先安裝IronPDF NuGet包。 您可以通過導航到工具 > NuGet包管理員 > NuGet包管理員解決方案,然後搜尋IronPDF來安裝:

C# ConfigureAwait (How It Works For Developers): Figure 1

或者,您可以在包管理控制台中運行以下命令:

Install-Package IronPdf

在程式碼中開始使用IronPDF之前,請確保您在程式碼檔案的開頭放置了using IronPdf;語句。 有關在您的環境中設置IronPDF的更深入指南,請查看快速入門頁面。

使用IronPDF非同步生成PDF文件

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

using IronPdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await GeneratePdfAsync();
    }

    static async Task GeneratePdfAsync()
    {
        // Create a new instance of ChromePdfRenderer.
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Example HTML content to be converted into a PDF.
        string htmlContent = "<h1>Hello World!</h1>";

        // Asynchronously render the HTML content as a PDF document.
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Asynchronously save the PDF document to a file.
        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()
    {
        // Create a new instance of ChromePdfRenderer.
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Example HTML content to be converted into a PDF.
        string htmlContent = "<h1>Hello World!</h1>";

        // Asynchronously render the HTML content as a PDF document.
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);

        // Asynchronously save the PDF document to a file.
        await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));

        Console.WriteLine("Working!");
    }
}
$vbLabelText   $csharpLabel

在此程式碼中,我們在GeneratePdfAsync()方法中非同步創建了PDF文件。 ChromePdfRenderer用於創建渲染器,這在從HTML內容創建PDF文件時非常重要。 PdfDocument類用於從提供的HTML字串創建PDF,然而,您也可以使用它從HTML檔案URL圖片等創建PDF。 關於使用IronPDF創建PDF的不同方法,請查看如何操作部分

非同步處理大型PDF文件

在處理大型PDF文件時,使用帶有ConfigureAwait(false)的非同步方法可以顯著提高性能,因為它可以在漫長的操作期間解放主執行緒。 在本示例中,我使用了一個大型的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 asynchronously.
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);

            // Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
            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 LongPdfTask: {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 asynchronously.
            PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);

            // Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
            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 LongPdfTask: {ex.Message}");
        }
    }
}
$vbLabelText   $csharpLabel

在上述程式碼中,ConfigureAwait(false)用於從超過200頁的PDF文件中提取所有文本的耗時任務。

  • 匯入和設置:我們程式碼頂部的第一部分致力於匯入必要的程式庫和命名空間。 您需要確保有using IronPdf;才能使用IronPDF程式庫。
  • 類和主方法:class Program定義了這包含本專案的主應用程式程式碼的類。 static async Task Main(string[] args)是應用程式的進入點。 在這裡,我們用async標記它,以便我們的非同步操作可以從中運行。 然後,我們使用await LongPdfTask()來非同步調用LongPdfTask方法。
  • 嘗試塊:我將LongPdfTask方法中的程式碼包裹在try-catch塊中,以優雅地處理任何意外的例外情況。

    • PdfDocument PDF = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false):這行可以分成三個不同的部分:

    • PdfDocument.FromFile("Sample.pdf"):這部分同步地將指定的PDF文件加載到IronPdf.PdfDocument對象中。
    • await Task.Run(() => ...):在單獨的線程上運行PDF加載操作,以避免阻塞主線程。 這讓它成為一個非同步操作。
    • .ConfigureAwait(false):避免捕獲當前上下文,應提高性能並減少死鎖。
  • string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false):這運行IronPDF文本提取方法,ExtractAllText()。 再次,await Task.Run(() => ...)用於在單獨的線程上非同步運行此操作。
  • await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false):通過這個,我們使用await Task方法再次非同步地將提取的文本寫入一個.txt文件。

之前

C# ConfigureAwait (How It Works For Developers): Figure 2

輸出

C# ConfigureAwait (How It Works For Developers): Figure 3

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

何時使用ConfigureAwait(true)與ConfigureAwait(false)

ConfigureAwait(false)最適合於程式庫程式碼或背景處理,因為在這裡不需要保留同步上下文。 通常,這用於伺服器端程式碼,其中性能是關鍵。 使用ConfigureAwait(false)表示當await操作完成後,連續操作不一定在開始非同步操作的相同線程上運行。

在PDF處理方面,實施ConfigureAwait(false)有助於在運行多個PDF處理任務以避免與上下文切換相關的瓶頸。 它還可以幫助應用程式在處理大量PDF文件時保持平穩運行,並在您在主控台應用程式或背景服務中工作時增強效能,而不需要上下文切換。

ConfigureAwait(true)最適合用於UI、程式碼的單元測試或必須在同一上下文中運行連續操作的ASP.NET應用程式,儘管如果使用錯誤可能會導致死鎖。 例如,如果您正在更新UI或存取httpcontext)。 ConfigureAwait(true)是預設行為,也可以寫成簡單的ConfigureAwait

當用於PDF處理任務時,在UI應用程式(如WPF,WinForms等)緊密集成中,這可能尤其有益,如顯示進度,並且您需要捕獲同步上下文以確保這些更新在UI執行緒上進行。 當處理需要特定線程的由於線程親和性要求的線程敏感操作時也非常有用。

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

在非同步程式中處理例外情況是重要的方面,需要仔細考慮,未處理的例外情況可能會終止應用程式。 在非同步程式碼周圍使用try-catch塊是一種優雅的處理任何意外例外情況的好方法。

例如:

public async Task SafeGeneratePdfAsync()
{
    try
    {
        ChromePdfRenderer renderer = new ChromePdfRenderer();

        // Asynchronously render HTML as PDF and do not capture the context
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);

        // Asynchronously save PDF to file
        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();

        // Asynchronously render HTML as PDF and do not capture the context
        PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);

        // Asynchronously save PDF to file
        await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}
$vbLabelText   $csharpLabel

當使用帶有ConfigureAwait(false)的連續任務時,例外情況可以使用連續中的try-catch處理,或者使用Task.ContinueWith時通過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);
    }
}
$vbLabelText   $csharpLabel

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

IronPDF的關鍵功能和優勢

C# ConfigureAwait (How It Works For Developers): Figure 4

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

使用IronPDF,您可以從各種文件和資料類型生成PDF;包括HTML文件HTML字串URL圖片DOCXRTF,通常只需幾行程式碼! 它可以處理您的PDF文件的格式設定、應用自訂水印合併和拆分PDF、處理PDF加密安全性,等等。

IronPDF對非同步編程的支持

IronPDF為許多操作提供了非同步方法,允許開發者無縫地運用async/await模式。 這一支持確保IronPDF能夠集成到性能要求高的應用程式中而不影響回應性,使其成為在非同步環境中工作於PDF相關任務的開發者的寶貴PDF工具。

授權

如果您想親自嘗試IronPDF並探索其廣泛的功能,您可以輕鬆做到,因為它提供了一個免費試用期。 藉由快速簡便的安裝,您將能在不久的未來將IronPDF配置並運行在您的PDF項目中。想繼續使用它並利用其強大的功能提升您的PDF效果嗎? 授權僅需$799,並附帶慷慨的30天退款保證,一整年的產品支持與更新,同時也提供永久授權(所以不會有麻煩的定期費用!)

C# ConfigureAwait (How It Works For Developers): Figure 5

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

要非同步生成PDF,我們將使用IronPDF執行用於渲染HTML文件並保存結果的程式碼,同時使用ConfigureAwait(false)以確保連續不會不必要地切換回原始同步上下文。

using IronPdf;
using System.Threading.Tasks;
using System;

class Program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }

    static async Task<string> CreateInvoicePdfAsync()
    {
        // Instance of ChromePdfRenderer to convert HTML to PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            // Render HTML file as a PDF asynchronously without capturing the context.
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);

            // Save the generated PDF asynchronously.
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);

            return "invoice.pdf";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
using IronPdf;
using System.Threading.Tasks;
using System;

class Program
{
    public static async Task Main(string[] args)
    {
        await CreateInvoicePdfAsync();
    }

    static async Task<string> CreateInvoicePdfAsync()
    {
        // Instance of ChromePdfRenderer to convert HTML to PDF
        ChromePdfRenderer renderer = new ChromePdfRenderer();
        try
        {
            // Render HTML file as a PDF asynchronously without capturing the context.
            var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);

            // Save the generated PDF asynchronously.
            await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);

            return "invoice.pdf";
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error generating PDF: {ex.Message}");
            return null;
        }
    }
}
$vbLabelText   $csharpLabel

在此範例中,我們使用創建的非同步方法,static async Task CreateInvoicePdfAsync(),從RenderHtmlFileAsPdfAsync方法提供的HTML文件中生成PDF發票。 我們使用了ConfigureAwait(false)來防止此任務的連續在原上下文中繼續,從而提高我們非UI應用程式的性能。

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

HTML文件

C# ConfigureAwait (How It Works For Developers): Figure 6

輸出

C# ConfigureAwait (How It Works For Developers): Figure 7

正如您所見,我們成功地將HTML文件非同步生成為PDF,併為我們創建了一個清晰、高品質的PDF文件。

結論

非同步編程對於構建回應迅速且高效的.NET應用程式至關重要,正確地使用ConfigureAwait可以幫助您實現最佳性能,特別是當您撰寫應用程序級別的程式碼時。 當使用IronPDF時,利用非同步方法以及ConfigureAwait(false)可確保您的PDF處理任務不會阻塞主線程,從而提高應用程式的整體回應性。 透過理解何時以及如何使用ConfigureAwait,您可以讓您的IronPDF PDF處理任務更加可靠且性能友好。

現在您可以像專業人士一樣利用ConfigureAwait與IronPDF進行非同步編程,那您還在等什麼呢? 今天就嘗試IronPDF來看看它如何改善您的PDF相關專案! 如果您想了解更多IronPDF所提供的廣泛功能,作為一個功能強大的通用程式庫程式碼,請務必查看其實用的操作指南。 或者,如果您想閱讀更多有關使用IronPDF的非同步編程方法,或者只是想了解有關IronPDF的一般信息,看看我們的博客文章。 如果您正在尋找更多非同步PDF生成的範例,請查看我們的C# Wait For Seconds文章,或我們關於C# Task.Run的其他文章。

常見問題解答

在非同步程式設計中,ConfigureAwait 是甚麼?

ConfigureAwait 是在非同步程式設計中用來指定是否應在原始同步內容或不同的內容上執行 await 表達式之後的延續的一個方法。使用 ConfigureAwait(false) 可以避免捕獲同步上下文來防止死鎖。

如何在 C# 中非同步地產生 PDF?

您可以使用 IronPDF 的非同步方法在 C# 中生成 PDF。這可以提高效率和反應能力,特別是在處理大文件時,因為不會阻塞主應用程式執行緒。

為甚麼應該在我的 C# 應用程式中使用 ConfigureAwait(false)?

在您的 C# 應用程式中使用 ConfigureAwait(false) 可以通過允許延續在線程池線程上運行來提高性能,避免不必要的上下文切換和潛在的死鎖,特別是在庫代碼中。

在 .NET 中使用 IronPDF 進行 PDF 處理的好處是甚麼?

IronPDF 提供豐富的功能,例如 PDF 生成、文本提取和合併,同時具有出色的跨平台兼容性。它支持非同步程式設計,適合於對性能要求嚴苛的應用程式。

如何在非同步 PDF 處理任務中處理異常?

在非同步 PDF 處理任務中,異常可以通過在非同步方法周圍使用 try-catch 塊來管理。IronPDF 允許您優雅地處理異常,從而確保應用程式的穩定性。

非同步方法如何改善使用 IronPDF 的 PDF 處理?

IronPDF 中的非同步方法允許您在不阻塞主應用程式執行緒的情況下執行 PDF 處理任務。這導致應用程式的反應能力和效率得到提高,特別是在大型或複雜的 PDF 操作中。

在庫代碼中使用 ConfigureAwait 有哪些重要考慮事項?

在庫代碼中使用 ConfigureAwait 時,重要的是使用 ConfigureAwait(false) 來避免捕獲同步上下文,從而提高性能並在非同步操作中防止死鎖。

如何在 C# 專案中設置 IronPDF?

要在 C# 專案中設置 IronPDF,您可以使用 NuGet 套件管理器來搜尋 IronPDF,也可以在套件管理控制台中運行命令 Install-Package IronPDF

是甚麼使 IronPDF 成為開發人員的有價值工具?

IronPDF 對於開發人員來說是一個有價值的工具,因為其強大的功能集包括 PDF 生成、文本提取和加密。它支持非同步處理,幫助開發人員創建反應良好且高效的應用程式。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me