【问题标题】:Task Was Canceled任务被取消
【发布时间】:2017-09-14 02:08:46
【问题描述】:

我正在尝试通过 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) 和异步代码而导致死锁。
  • 您确实需要格式化您的代码,显然缺少}
  • 你可以跳过这些东西。无论如何我得到了完美的输出。只有一条记录我得到了一个例外
  • 您下载的文件有多大?您的 HttpClient 超时设置为多长时间?如果要下载的文件比您设置的超时时间长,则会导致 TaskCancelledException

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


【解决方案1】:

由于混合阻塞调用 (.Result) 和 async-await 代码而导致死锁。

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

该行也应该等待

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

【讨论】:

    【解决方案2】:

    尝试确保释放响应对象:

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

    留下太多未处理的 HttpResponseMessage 对象会占用网络资源,这意味着以后的请求将阻塞等待其中一个资源(这些资源永远不会被释放,因为没有内存压力来触发 GC)并最终导致时间出去。

    我有很多项目都经历过同样的僵局。尽快处理 IDiposable 的东西非常重要,尤其是 HttpResponseMessage 对象。

    【讨论】:

    • 在这一点上,我认为没有人可以对您提供的信息提供帮助。听起来好像是这段代码之外的东西......人们的建议应该已经解决了这个问题。尝试使用 Fiddler 之类的工具来查看网络请求是否符合您的预期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 2019-01-03
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多