我试图让一段代码运行得更快。代码已经在使用 async/await。但它仍然很慢。
所以我试图改变我的 foreach 以使用新的 IAsyncEnumerable。但是,我从中获得了 0 性能。它似乎按顺序运行代码。这让我很惊讶。我认为await foreach
它将在自己的线程中运行每次迭代。
这是我加快代码速度的尝试。
var bag = new ConcurrentBag<IronPdf.PdfDocument>(); // probably don't need a ConcurrentBag
var foos = _dbContext.Foos;
await foreach (var fooPdf in GetImagePdfs(foos))
{
bag.Add(fooPdf);
}
private async IAsyncEnumerable<IronPdf.PdfDocument> GetImagePdfs(IEnumerable<Foo> foos)
{
foreach (var foo in foos)
{
var imagePdf = await GetImagePdf(foo);
yield return imagePdf;
}
}
private async Task<IronPdf.PdfDocument> GetImagePdf(Foo foo)
{
using var imageStream = await _httpService.DownloadAsync(foo.Id);
var imagePdf = await _pdfService.ImageToPdfAsync(imageStream);
return imagePdf;
}
using IronPdf;
public class PdfService
{
// this method is quite slow
public async Task<PdfDocument> ImageToPdfAsync(Stream imageStream)
{
var imageDataURL = Util.ImageToDataUri(Image.FromStream(imageStream));
var html = $@"<img style=""max-width: 100%; max-height: 70%;"" src=""{imageDataURL}"">";
using var renderer = new HtmlToPdf(new PdfPrintOptions()
{
PaperSize = PdfPrintOptions.PdfPaperSize.A4,
});
return await renderer.RenderHtmlAsPdfAsync(html);
}
}
我也Parallel.ForEach
试了一下
Parallel.ForEach(foos, async foo =>
{
var imagePdf = await GetImagePdf(foo);
bag.Add(imagePdf);
});
但是我一直在阅读我不应该使用异步它,所以不知道该怎么做。这样做时 IronPdf 库也会崩溃。