【发布时间】:2018-06-11 09:38:26
【问题描述】:
我在 WPF 客户端中有一个用于 Web API 的方法:
public async Task PostFileAsync(string localPath, string serverPath)
这个方法的核心是调用:
var resp = await _client.PostAsync(uri, content);
其中_client 是HttpClient 实例。
当我尝试上传明显耗时过长的大文件时,我收到 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