我使用带有HttpCompletionOption.ResponseHeadersRead
的SendAsync
首先获取头文件。接下来,我检查Content-Type
和Content-Length
以确保响应是标记的,并且大小合适。如果超过一定的时间跨度,我会使用CancellationTokenSource
来取消SendAsync
。
但是,如果类型和大小正确,我将继续使用ReadAsStringAsync
实际获取标记字符串。是否可以向此调用添加取消令牌?因此,如果实际下载时间太长,我可以中止下载。或者可以用任何其他方式来完成?
我不想使用GetStringAsync
,因为我使用的是自定义HttpRequestMessage
。
PS__:我是C#的新手,2周。可能有什么东西在躲避我。
发布于 2021-02-17 23:55:51
发布于 2014-08-09 21:58:50
不,你不能。有接受取消令牌的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);
}
发布于 2018-07-24 04:53:21
如果可以使用大锤子,您可以处理HttpClient,它将关闭所有内容。与仅仅放弃对GetStringAsync的不想要的调用不同,这避免了浪费网络资源,从而加快了其他操作(可能包括您的下一个操作)。
https://stackoverflow.com/questions/25219287
复制相似问题