C#Net.HttpClient取消ReadAsStringAsync?

时间:2014-08-09 13:54:24

标签: c# .net async-await dotnet-httpclient

我使用SendAsyncHttpCompletionOption.ResponseHeadersRead来获取标头。接下来,我检查Content-TypeContent-Length以确保响应是标记并且大小合适。如果超过特定时间跨度,我会使用CancellationTokenSource取消SendAsync

但是,如果类型和大小正确,我继续实际用ReadAsStringAsync获取标记字符串。 我可以在此次通话中添加取消令牌吗?因此,如果实际下载时间过长,我可以将其中止。或者这可以通过其他方式完成吗?

在使用自定义GetStringAsync时,我不想使用HttpRequestMessage

PS :我是C#的新手,2周。有些东西可能会让我不知所措。

3 个答案:

答案 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)

现在可在 .NET 5 中使用:

ReadAsStringAsync(CancellationToken) 

reference

答案 2 :(得分:0)

如果可以使用大铁锤,则可以处置HttpClient,它将关闭所有组件。与只放弃不需要的对GetStringAsync的调用不同,这避免了浪费网络资源,从而加快了其他操作的速度(可能包括您下一个操作将要执行的操作)。