IRONSOFTWAREHOME
开发者更新

C# ConfigureAwait(开发者如何使用)

Jacob Mellor, Chief Technology Officer @ Team Iron
Jacob Mellor
Updated: 2026年4月21日

作为开发人员,异步编程可以极其有益,它可以提高应用程序的性能、效率和响应能力,特别是那些处理需要不可预测时间完成的操作的应用程序。 通过使用ConfigureAwait(false),您可以在某些情况下避免死锁。 死锁发生在异步编程中,当存在一个期望操作完成后再继续的同步上下文(例如桌面应用程序中的UI线程)时。 仍然,等待的任务正在等待同步上下文可用,从而创建了循环等待。

今天,我们将研究ConfigureAwait如何与 IronPDF 一起使用,以通过异步编程高效地执行 PDF 处理任务。 IronPDF 是一个 .NET PDF 库,使处理与 PDF 相关的任务变得轻松。 凭借一套强大功能、强大的跨平台兼容性和丰富的文档,它是开发者工具包中一款强大的PDF工具。

Understanding Asynchronous Programming in C#

什么是异步编程?

异步编程是指编写代码的一种方法,它允许某些操作独立于主应用程序线程运行。 这对于需要等待的长时间运行任务(例如 I/O 操作)非常有用。 通过允许这些任务在不阻塞主线程的情况下运行,应用程序可以继续运行,而这些任务则需要时间完成,从而最终提高了应用程序的性能和响应能力。

在异步代码中使用 ConfigureAwait 的作用

ConfigureAwait是异步编程中的一种方法,用于控制继续执行的方式。 延续是await表达式之后运行的代码,默认情况下ConfigureAwait(false)

使用ConfigureAwait(false)有助于避免死锁,因为当您使用它时,您是在告知任务不要捕获当前的同步上下文,也不尝试在原始上下文上恢复。 这允许继续在线程池线程上运行,而不是在原始上下文上运行,从而防止主线程被阻塞。

ConfigureAwait(false)在库代码中或在恢复原始上下文不必要的情况下尤其有用,从而确保代码保持灵活且无死锁。

如何将 ConfigureAwait 与 IronPDF 一起使用

在 .NET 项目中设置 IronPDF

要开始在 .NET 项目中使用 IronPDF,请首先安装IronPDF NuGet 包。 您可以通过导航到工具 > NuGet 包管理器 > 解决方案的 NuGet 包管理器并搜索 IronPDF 来做到这一点:

C# ConfigureAwait(开发人员工作原理):图1

或者,在包管理器控制台中运行以下命令:

PM > Install-Package IronPdf

要在代码中开始使用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()
    {
        // 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!");
    }
}

在此代码中,我们在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}");
        }
    }
}

在上述代码中,ConfigureAwait(false)被用于从大型PDF文件中提取所有文本的耗时任务中,该文件在我们的案例中超过200页。

  • 导入和设置: 代码顶部的第一个部分专门用于导入必要的库和命名空间。 您需要确保拥有using IronPdf;来使用IronPDF库。

  • 类和主方法:class Program定义了包含此项目主要应用代码的类。 static async Task Main(string[] args)是应用程序的入口点。 在此,我们将其标记为async,以便我们的异步操作可以从其中运行。 然后,我们使用**await LongPdfTask()**异步调用 LongPdfTask 方法。

  • Try 块: 我在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(开发人员工作原理):图2

输出

C# ConfigureAwait(开发人员工作原理):图3

在 .NET 应用程序中使用 ConfigureAwait 的最佳实践

何时使用 ConfigureAwait(true) vs. ConfigureAwait(false)

ConfigureAwait(false) 在您处理库代码或后台处理时使用最佳,在这些情况下不需要保留同步上下文。 通常,这是针对性能至关重要的服务器端代码。 使用**ConfigureAwait(false)意味着当await**操作完成时,继续操作不一定在初始异步操作开始时创建的同一线程上执行。

在 PDF 处理时,应用**ConfigureAwait(false)**可以最大限度地提高运行多个 PDF 处理任务时的性能,从而帮助避免与上下文切换相关的瓶颈。 当需要处理大量 PDF 文件并保持应用程序平稳运行时,这也特别有用,在处理控制台应用程序或后台服务时,不必要的上下文切换可能会影响效率。

ConfigureAwait(true) 在 UI、代码的任何单元测试或 ASP.NET 应用程序中最佳使用,在这些应用程序中继续操作必须运行在相同上下文中,尽管使用错误可能导致死锁。 例如,如果您正在更新 UI 或访问 httpcontext)。 ConfigureAwait(true) 是默认行为,也可以写为ConfigureAwait

当用于 PDF 处理任务时,这在例如您的 PDF 处理代码与 UI 紧密集成(例如使用 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}");
    }
}

当使用带有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);
    }
}

为什么选择 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 的潜力。 using IronPDF,您可以根据各种文件和数据类型生成PDF,包括HTML 文件HTML 字符串URL图片DOCXRTF,通常只需几个代码行即可完成! 它可以处理 PDF 文档的格式,应用自定义水印合并和拆分 PDF、处理PDF 加密安全性,等等。

IronPDF 对异步编程的支持

IronPDF 为其许多操作提供异步方法,使开发人员能够无缝利用 async/await 模式。 这种支持确保了 IronPDF 可以集成到对性能要求苛刻的应用程序中,而不会牺牲响应能力,使其成为在异步环境中进行 PDF 相关任务的开发人员的重要工具。

许可

如果您想亲自尝试 IronPDF 并探索其丰富的功能,您可以通过其免费试用期轻松做到这一点。 安装快捷简便,您可以即刻在 PDF 项目中运行 IronPDF。想继续使用它并利用其强大功能提升您的 PDF 水平吗? 许可证起价仅为$999,并提供慷慨的30天退款保证、整整一年的产品支持和更新,并且以永久许可证的形式提供(因此没有讨厌的经常性费用!)

C# ConfigureAwait(开发人员工作原理):图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;
        }
    }
}

在此示例中,我们使用我们创建的异步方法static async Task<string> CreateInvoicePdfAsync(),从RenderHtmlFileAsPdfAsync方法提供的 HTML 文件生成 PDF 发票。 我们使用**ConfigureAwait(false)**来防止在原始同步上下文中继续此任务,从而改善我们非 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(false)可确保您的 PDF 处理任务不会阻塞主线程,从而提高应用程序的整体响应性。 通过了解何时以及如何使用ConfigureAwait**,您可以使您的 IronPDF PDF 处理任务更健壮且对性能更友好。

现在,您可以成为熟练使用ConfigureAwait和 IronPDF 的异步编程专家,还在等什么呢? 立即试用 IronPDF,看看它如何提升您的 PDF 相关项目! 如果您想了解更多关于 IronPDF 作为强大通用库代码提供的广泛特性信息,请务必查看其实用的指南。 或者,如果您想了解更多关于使用 IronPDF 结合异步编程方法的信息,或者只是想更全面地了解 IronPDF,请查看我们的博客文章。 如果您正在寻找更多异步 PDF 生成示例,请查看我们的C# 等待秒数文章,或我们的其他有关C# Task.Run的文章。

Jacob Mellor, Chief Technology Officer @ Team Iron
Chief Technology Officer

Jacob Mellor is Chief Technology Officer at Iron Software and a visionary engineer pioneering C# PDF technology. As the original developer behind Iron Software's core codebase, he has shaped the company's product architecture since its inception, transforming it alongside CEO Cameron Rimington into a 50+ person company serving NASA, Tesla, and global government agencies.

...
Read More

Related Articles

Key in blue circle

立即获取免费的 30 天试用版密钥

bullet_checked无需信用卡或创建账户
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge related to IronPDF Product Demo

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户