2016-06-24 2 views
1

Ich beschloss, die Methode zu konvertieren, die eine PDF zu asynchronen Aufruf generiert. Der asynchrone Aufruf erzeugt nicht die gewünschte PDF und ich habe keine Ahnung, warum dies geschiehtAsynchrone Async erwarten Methode zum Generieren von PDF

Der Kunde, der die Asynchron-Betrieb nennt, ist wie folgt:

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

Die Klasse verantwortlich für die PDF-Erzeugung ist die folgende:

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(); 
      } 
     }); 
    } 
} 

ich vermute, dass ich nicht etwas richtig mit dem async tun - warten Betrieb aber nicht wissen, was. Könnten Sie bitte helfen?

+3

Code Ihrer PDF-Generierung scheint nicht asynchron zu sein. Sie erhalten keinen Wert, wenn Sie eine neue Aufgabe erstellen. Nachdem Sie dies gesagt haben, ist Ihr direktes Problem, dass Sie 'Task.Run (..' anstelle von 'neue Aufgabe (...' –

+0

@ScottChamberlain nicht wirklich verwenden sollte es ungültig sein. Die gesamte PDF-Generierung findet innerhalb der GeneratePdfAsync-Methode statt – Nostradamus

+1

Ich habe zuerst nicht bemerkt, dass GeneratePdfAsync im zweiten Codebeispiel definiert wurde. Um hinzuzufügen, was Yacoub sagte, sollten Sie nie 'ne neue Aufgabe machen (...' auch, Sie warten nie auf die von GeneratePdfAsync zurückgegebene Aufgabe. –

Antwort

2

Sie sollten nie den Task Konstruktor verwenden. Je. Es hat absolut keine gültigen Anwendungsfälle. Überhaupt. Für jede Art von Ansatz für jede Art von Problem. Full details on my blog.

Da es keine asynchrone Arbeit zu tun ist, sollten Sie nur synchrone Methoden verwenden:

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

Wenn Sie dies aus einer GUI-Anwendung aufrufen wollen und wollen nicht den UI-Thread zu blockieren, können Sie dann kann Anruf es auf einem Hintergrund-Thread await Task.Run unter Verwendung als solche:

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