任务被取消而

问题描述:

我试图通过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

你可以跳过这些东西..反正我得到完美的输出..只有一个记录,我得到一个异常 –

因为阻塞调用(.Result)和async-await代码的混合的死锁。

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

该行应等待以及

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

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

尽量确保处置响应对象:

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

留下太多HttpResponseMessage对象未设置会占用网络资源,这意味着稍后的请求会阻止等待其中一个资源(永远不会释放,因为没有内存压力来触发GC),并最终超时。

我已经有大量的项目遇到这种相同的死锁。尽快处理可触发内容的事情非常重要,特别是,特别是 HttpResponseMessage对象。

+0

我试过了..不工作.. –

+1

在这一点上,我不认为有任何人都可以用你提供的信息来帮助你。听起来这是代码之外的东西......人们建议应该解决这个问题。尝试使用Fiddler之类的东西来查看网络请求是否按照您的期望进行。 –