我正在尝试通过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();
}
}
}
我正在获取此代码的Task被取消的异常。
答案 0 :(得分:0)
由于阻塞调用(.Result
)和async-await
代码的混合而导致死锁。
var response = client.GetAsync("URL?empNo=" + empNo).Result;
也应该等待那条线
var response = await client.GetAsync("URL?empNo=" + empNo);
答案 1 :(得分:0)
尝试确保处置响应对象:
using(var response = await client.GetAsync("URL?empNo=" + empNo))
{
// Rest of function
}
过多地放置HttpResponseMessage对象可能占用网络资源,这意味着以后的请求将阻止等待其中一个资源(永远不会被释放,因为没有内存压力来触发GC)并且最终时间进行。
我有很多项目经历过同样的僵局。尽快配置IDiposable的东西非常重要,尤其是 HttpResponseMessage对象。