任务被取消而
我试图通过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();
}
}
}
我得到的任务是取消此代码的例外。
因为阻塞调用(.Result
)和async-await
代码的混合的死锁。
var response = client.GetAsync("URL?empNo=" + empNo).Result;
该行应等待以及
var response = await client.GetAsync("URL?empNo=" + empNo);
不,不是的工作......不过相同的Exception –
尽量确保处置响应对象:
using(var response = await client.GetAsync("URL?empNo=" + empNo))
{
// Rest of function
}
留下太多HttpResponseMessage对象未设置会占用网络资源,这意味着稍后的请求会阻止等待其中一个资源(永远不会释放,因为没有内存压力来触发GC),并最终超时。
我已经有大量的项目遇到这种相同的死锁。尽快处理可触发内容的事情非常重要,特别是,特别是 HttpResponseMessage对象。
我试过了..不工作.. –
在这一点上,我不认为有任何人都可以用你提供的信息来帮助你。听起来这是代码之外的东西......人们建议应该解决这个问题。尝试使用Fiddler之类的东西来查看网络请求是否按照您的期望进行。 –
因混合阻塞调用('.Result')和异步代码而导致死锁。 – Nkosi
你真的需要格式化你的代码,显然有'''丢失。 – dat3450
你可以跳过这些东西..反正我得到完美的输出..只有一个记录,我得到一个异常 –