
C# ConfigureAwait(开发者如何使用)
作为开发人员,异步编程可以极其有益,它可以提高应用程序的性能、效率和响应能力,特别是那些处理需要不可预测时间完成的操作的应用程序。 通过使用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 来做到这一点:

或者,在包管理器控制台中运行以下命令:
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!");
}
}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
' Create a new instance of ChromePdfRenderer.
Dim renderer As New ChromePdfRenderer()
' Example HTML content to be converted into a PDF.
Dim htmlContent As String = "<h1>Hello World!</h1>"
' Asynchronously render the HTML content as a PDF document.
Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync(htmlContent)
' Asynchronously save the PDF document to a file.
Await Task.Run(Function() pdf.SaveAs("outputAsync.pdf"))
Console.WriteLine("Working!")
End Function
End Class在此代码中,我们在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}");
}
}
}Imports IronPdf
Imports System.Threading.Tasks
Imports System.IO
Imports System
Module Program
Async Function Main(args As String()) As Task
Await LongPdfTask()
End Function
Private Async Function LongPdfTask() As Task
Try
' Initialize IronPDF's PdfDocument asynchronously.
Dim pdf As PdfDocument = Await Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(False)
' Extract text from PDF asynchronously with ConfigureAwait to prevent context capture.
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 LongPdfTask: {ex.Message}")
End Try
End Function
End Module在上述代码中,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 文件。
前

输出

在 .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}");
}
}Public Async Function SafeGeneratePdfAsync() As Task
Try
Dim renderer As New ChromePdfRenderer()
' Asynchronously render HTML as PDF and do not capture the context
Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(False)
' Asynchronously save PDF to file
Await Task.Run(Sub() pdf.SaveAs("output.pdf")).ConfigureAwait(False)
Catch ex As Exception
Console.WriteLine($"An error occurred: {ex.Message}")
End Try
End Function当使用带有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);
}
}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
End Class为什么选择 IronPDF 满足您的 PDF 处理需求?
IronPDF 的关键特性和优势

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;
}
}
}Imports IronPdf
Imports System.Threading.Tasks
Imports System
Module Program
Public Async Function Main(args As String()) As Task
Await CreateInvoicePdfAsync()
End Function
Private Async Function CreateInvoicePdfAsync() As Task(Of String)
' Instance of ChromePdfRenderer to convert HTML to PDF
Dim renderer As New ChromePdfRenderer()
Try
' Render HTML file as a PDF asynchronously without capturing the context.
Dim pdf = Await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(False)
' Save the generated PDF asynchronously.
Await Task.Run(Sub() pdf.SaveAs("invoice.pdf")).ConfigureAwait(False)
Return "invoice.pdf"
Catch ex As Exception
Console.WriteLine($"Error generating PDF: {ex.Message}")
Return Nothing
End Try
End Function
End Module在此示例中,我们使用我们创建的异步方法static async Task<string> CreateInvoicePdfAsync(),从RenderHtmlFileAsPdfAsync方法提供的 HTML 文件生成 PDF 发票。 我们使用**ConfigureAwait(false)**来防止在原始同步上下文中继续此任务,从而改善我们非 UI 应用程序的性能。
我们还再次实现了await Task.Run()) => ...)方法以异步运行操作。 最后,我们使用pdf.SaveAs方法将新生成的 PDF 文件保存为 "invoice.pdf"。 在**CreateInvoicePdfAsync()**方法中的整段代码都被包裹在一个 try-catch 块中,以处理任何意外的异常。
HTML 文件

输出

如您所见,我们成功地将 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 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.
Related Articles


