我的网络请求是由这段代码处理的;
Response = await Client.SendAsync(Message, HttpCompletionOption.ResponseHeadersRead, CToken);
在读取响应标头之后、内容读取完成之前返回。当我拨打这条线来获取内容时......
return await Response.Content.ReadAsStringAsync();
我希望能够在 X 秒后停止它。但它不接受取消令牌。
当你can依靠WithCancellation
为了重用目的,一个更简单的超时解决方案(不会抛出OperationCanceledException
)将创建一个超时任务Task.Delay
并等待第一个任务完成Task.WhenAny
:
public static Task<TResult> WithTimeout<TResult>(this Task<TResult> task, TimeSpan timeout)
{
var timeoutTask = Task.Delay(timeout).ContinueWith(_ => default(TResult), TaskContinuationOptions.ExecuteSynchronously);
return Task.WhenAny(task, timeoutTask).Unwrap();
}
或者,如果您想在超时时抛出异常,而不是仅返回默认值(即null
):
public static async Task<TResult> WithTimeout<TResult>(this Task<TResult> task, TimeSpan timeout)
{
if (task == await Task.WhenAny(task, Task.Delay(timeout)))
{
return await task;
}
throw new TimeoutException();
}
用法是:
var content = await Response.Content.ReadAsStringAsync().WithTimeout(TimeSpan.FromSeconds(1));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)