【问题标题】:Task canceled exception for long running task长时间运行的任务的任务取消异常
【发布时间】:2018-06-11 09:38:26
【问题描述】:

我在 WPF 客户端中有一个用于 Web API 的方法:

public async Task PostFileAsync(string localPath, string serverPath)

这个方法的核心是调用:

var resp = await _client.PostAsync(uri, content);

其中_clientHttpClient 实例。

当我尝试上传明显耗时过长的大文件时,我收到 A task was canceled. 异常,并带有以下堆栈跟踪:

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Net.Http.HttpClient.<FinishSendAsyncBuffered>d__58.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at QuickDrive.Wpf.Api.ApiClient.<PostFileAsync>d__10.MoveNext() in C:\Projects\QuickDrive\Code\QuickDrive.Wpf\Api\ApiClient.cs:line 176

我没有看到这里提到任何超时,但是对于花费不到 10 分钟的帖子(我没有准确计时),这个任务可以很好地完成,例如小于 +-500MB 的文件在我的连接上。

这个异常真的是因为超时吗?如果是这样,我该如何配置await,以便在取消任务之前留出可配置的时间;假设任务由于超时而被取消。除了我尝试上传大文件时,它在任何其他情况下都不会被取消。

【问题讨论】:

  • 这与Task类无关,请尝试设置HttpClient.Timeout属性。
  • 这就是为什么云存储解决方案提供了将不同的数据块上传到端点的选项,然后将它们与上传的块的清单一起串接在一起。重量级的上传在许多不同的方面都是危险的。考虑一种不会让您与任何预先配置的超时发生冲突的方法。
  • @spender 我已经设置了 1GB 的上传限制,所以如果我配置一个公平的超时,我认为任何上传都不应该是一个真正的问题。我们需要尽快推出,所以我不想在这个阶段介绍分块上传的复杂性,但谢谢。我会考虑在下一个版本中改进上传。

标签: c# asynchronous async-await timeout


【解决方案1】:

试试这个

httpClient.Timeout

获取或设置请求超时前等待的时间跨度。

要设置无限超时,请将属性值设置为 无限时间跨度。

HttpClient 似乎只是超时并取消了任务

【讨论】:

  • 只是一个警告:显然,如果您使用例如,您需要在流 istelf 上设置超时。 response.content.ReadAsStreamAsync 任何地方,因为流有自己的超时。参考这个答案:stackoverflow.com/a/45667609/8741
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
相关资源
最近更新 更多