IRONSOFTWAREHOME
开发者更新

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

Jacob Mellor,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、图片、DOCX和RTF,通常只需几个代码行即可完成! 它可以处理 PDF 文档的格式,应用自定义水印、合并和拆分 PDF、处理PDF 加密和安全性,等等。

IronPDF 对异步编程的支持

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

许可

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

示例:使用 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,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

相关文章

Key in blue circle

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

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

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

Iron Software 的客户徽标
获取您的无义务咨询
您的资料将始终保密。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
深受全球数百万工程师信赖
立即获取您的免费30 天试用密钥。
无需信用卡或创建账户
C# 用于 PDF 的 NuGet 库
通过 NuGet 安装

版本: 2026.10

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. 在解决方案资源管理器中,右键点击引用,管理 NuGet 包
  2. 选择浏览并搜索 “IronPDF”
  3. 选择包并安装
C# PDF DLL
下载 DLL

版本: 2026.10

或在此处下载 Windows 安装程序。

  1. 下载并解压 IronPDF 到您的解决方案目录中的 ~/Libs 之类的位置
  2. 在 Visual Studio 解决方案资源管理器中,右键点击引用。选择浏览,“IronPDF.dll”

$999 起