如何为 iText 7 实现异步等待模式?

How to implement async-await pattern for iText 7?

为什么 iText sharper 库不公开任何异步方法?

我习惯使用图书馆的 APM 方法 MethodNameAsync()。这让我有点困惑,因为 iText 没有公开 APM 方法。 这有什么理由吗?阅读和操作 PDF 不需要异步编程?

我将在 ASP.Net 核心控制器上使用 PDF 读取。如果要获得性能和并行性,异步读取 PDF 不是很重要吗?

回答第一个问题:

Why does the iText sharper library do not expose any asynchronous method?

通常,为自然异步的操作公开异步方法是一种很好的做法,例如非 CPU-bound 的网络或文件操作。有关原因的详尽解释,请参阅 Stephen Cleary 的 excellent post,但足以说明对 in-memory PDF 文档的操作很可能是 CPU-bound,并且不是包装在异步方法中可能不会带来任何好处,但实际上是有代价的,如果所有这些方法都像 Task.Run(...).

如果您需要通过执行 CPU-bound 工作来避免阻塞应用程序的主线程(例如在 UI 应用程序中),您可以使用 Task.Run() 来完成此操作,例如以下:

await Task.Run(() =>
{
    // Run numerous CPU-bound PDF operations using iTextSharp...
    var text = PdfTextExtractor.GetTextFromPage(page);
    // Run more CPU-bound PDF operations...
});

重要的一点是:这种方法允许您,API 消费者,决定如何处理这样一个事实,即对 iText SDK 进行如此多的调用主要涉及对 CPU 的操作。

Reading and manipulating PDF's does not require asynchronous programming?

阅读,也许,取决于它从哪里阅读。我认为他们正试图为您提供一个统一的界面来从多个地方阅读 PDF,其中一些不会 I/O 绑定。

I will be using PDF reads on an ASP.Net Core controller. In case to gain performance and parallelism, would not it be crucial to read the PDF asynchronously?

在之前链接的 Stephen post 中也有概述,在 ASP.NET 上使用 thread-pool 个线程是个坏主意 。为一个请求分配另一个 thread-pool 线程不仅不会帮助您提高性能,还会减少其他请求可用的线程(从而限制服务器处理更多请求的能力),以及许多其他问题。

关于并行性,这是 Web 服务器 excel 的主题。他们可以一次处理许多请求!因此,如果您的请求读取或生成 PDF,每个 ASP.NET 控制器操作都可以同步执行,其他请求仍将由 Web 服务器处理。只有当您的 PDF 操作确实需要很长时间才能 运行 时,您才有可能遇到问题。如果是这样,您应该考虑使用 Hangfire 或类似方法 运行 将它们 out-of-band 化,并在操作完成后向用户发送电子邮件。