我决定将生成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();
}
});
}
}
我怀疑我没有使用异步 - 等待操作做对,但不知道是什么。你能帮忙吗?
答案 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));