2017-09-14 101 views
-1

我試圖通過API調用從數據庫下載PDF .. 所有PDF越來越下載,但只有一行我得到任務被取消例外任務被取消而

public async System.Threading.Tasks.Task<ActionResult> Record(string empNo) 
{ 
    using (var client = new HttpClient()) 
    { 

     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/pdf")); 
     var response = client.GetAsync("URL?empNo=" + empNo).Result; 

     if (response.IsSuccessStatusCode) 
     { 
      var files = Directory.GetFiles(Server.MapPath(@"~/EmpPDF/")); 
      foreach (var file in files) 
      { 
       try 
       { 
        System.IO.File.Delete(file); 
       } 
       catch 
       { } 
      } 
      var bytes = await response.Content.ReadAsByteArrayAsync(); 


      using (Stream writer = System.IO.File.Create(System.Web.HttpContext.Current.Server.MapPath(@"~EmpPDF/" + empNo + ".pdf"))) 
      { 
       writer.Write(bytes, 0, bytes.Length); 
       writer.Flush(); 
       responsePDFPath = @"/EmpPDF/" + empNo + ".pdf"; //+ response.Content.Headers.ContentDisposition.FileName; 
      } 

      ViewBag.PathToPdf = responsePDFPath; 
      return View(); 
     } 
    } 
} 

我得到的任務是取消此代碼的例外。

+0

因混合阻塞調用('.Result')和異步代碼而導致死鎖。 – Nkosi

+0

你真的需要格式化你的代碼,顯然有'''丟失。 – dat3450

+0

你可以跳過這些東西..反正我得到完美的輸出..只有一個記錄,我得到一個異常 –

回答

0

因爲阻塞調用(.Result)和async-await代碼的混合的死鎖。

var response = client.GetAsync("URL?empNo=" + empNo).Result; 

該行應等待以及

var response = await client.GetAsync("URL?empNo=" + empNo); 
+0

不,不是的工作......不過相同的Exception –

0

儘量確保處置響應對象:

using(var response = await client.GetAsync("URL?empNo=" + empNo)) 
{ 
    // Rest of function 
} 

留下太多HttpResponseMessage對象未設置會佔用網絡資源,這意味着稍後的請求會阻止等待其中一個資源(永遠不會釋放,因爲沒有內存壓力來觸發GC),並最終超時。

我已經有大量的項目遇到這種相同的死鎖。儘快處理可觸發內容的事情非常重要,特別是,特別是 HttpResponseMessage對象。

+0

我試過了..不工作.. –

+1

在這一點上,我不認爲有任何人都可以用你提供的信息來幫助你。聽起來這是代碼之外的東西......人們建議應該解決這個問題。嘗試使用Fiddler之類的東西來查看網絡請求是否按照您的期望進行。 –