任务被取消

时间:2017-09-14 02:08:46

标签: c# json asp.net-web-api model-view-controller controller

我正在尝试通过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被取消的异常。

2 个答案:

答案 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对象。