异步异步等待生成pdf的方法

时间:2016-06-24 13:42:36

标签: c# pdf asynchronous

我决定将生成PDF的方法转换为异步调用。异步调用不会产生请求的PDF,我不知道为什么会发生这种情况

调用异步操作的客户端如下:

public QuotationResponse CreateQuotation(IQuotation quotation)
{
    ...
    // Create Quotation PDF
    _pdfWriter.GeneratePdfAsync(response);
    return response;
}

负责生成PDF的类如下:

public class Writer
{
   //... other class methods
   public async Task GeneratePdfAsync(QuotationResponse response)
   {
       await new Task(() =>
       {
            var currentPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
            var formFile = Path.Combine(currentPath, Settings.Default.QUOTATION_TEMPLATE_PATH);
            var newFile = Path.Combine(currentPath, Settings.Default.QUOTATION_PDF_PATH);
            var reader = new PdfReader(formFile);
            using (PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create)))
            {
                ....
                // flatten form fields and close document
                stamper.FormFlattening = true;
                stamper.Close();
            }
       });
   }
}

我怀疑我没有使用异步 - 等待操作做对,但不知道是什么。你能帮忙吗?

1 个答案:

答案 0 :(得分:2)

您永远不应该使用Task构造函数。永远。它绝对没有有效的用例。完全没有。对于任何类型的问题的任何方法。 Full details on my blog

由于没有异步工作要做,您应该只使用同步方法:

public class Writer
{
  //... other class methods
  public void GeneratePdfAsync(QuotationResponse response)
  {
    var currentPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
    ...
  }
}

如果你想从GUI应用程序中调用它并且不想阻止UI线程,那么你可以使用await Task.Run在后​​台线程上调用,就这样:

QuotationResponse response = await Task.Run(() => CreateQuotation(quotation));