我使用SendAsync
和HttpCompletionOption.ResponseHeadersRead
来获取标头。接下来,我检查Content-Type
和Content-Length
以确保响应是标记并且大小合适。如果超过特定时间跨度,我会使用CancellationTokenSource
取消SendAsync
。
但是,如果类型和大小正确,我继续实际用ReadAsStringAsync
获取标记字符串。 我可以在此次通话中添加取消令牌吗?因此,如果实际下载时间过长,我可以将其中止。或者这可以通过其他方式完成吗?
在使用自定义GetStringAsync
时,我不想使用HttpRequestMessage
。
PS :我是C#的新手,2周。有些东西可能会让我不知所措。
答案 0 :(得分:5)
不,你不能。 no overload of ReadAsStringAsync
接受取消令牌并can't cancel a non-cancelable async operation。
然而,您可以放弃该操作并继续使用WithCancellation
扩展方法,该方法实际上不会取消操作,但会让代码像以前一样流动:
static Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken)
{
return task.IsCompleted
? task
: task.ContinueWith(
completedTask => completedTask.GetAwaiter().GetResult(),
cancellationToken,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
}
答案 1 :(得分:2)
答案 2 :(得分:0)
如果可以使用大铁锤,则可以处置HttpClient,它将关闭所有组件。与只放弃不需要的对GetStringAsync的调用不同,这避免了浪费网络资源,从而加快了其他操作的速度(可能包括您下一个操作将要执行的操作)。