gpt4 book ai didi

c# - 如何为不接受取消 token 的异步函数设置超时?

转载 作者:太空狗 更新时间:2023-10-29 20:13:23 24 4
gpt4 key购买 nike

我的网络请求由这段代码处理;

Response = await Client.SendAsync(Message, HttpCompletionOption.ResponseHeadersRead, CToken);

在读取响应头之后和内容读取完成之前返回。当我调用此行以获取内容时...

return await Response.Content.ReadAsStringAsync();

我希望能够在 X 秒后停止它。但它不接受取消 token 。

最佳答案

虽然您可以依靠 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));

关于c# - 如何为不接受取消 token 的异步函数设置超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25985416/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com