gpt4 book ai didi

.net - 超时后如何取消异步 WebApi 操作?

转载 作者:行者123 更新时间:2023-12-01 10:04:35 25 4
gpt4 key购买 nike

使用 ASP.Net WebAPI,我有一个带有类似于以下异步操作的 Controller :

[HttpPost]
public async Task<string> DoSomething(string foo)
{
var result = await MyAsynchronousTask(foo);
return result;
}

这个 Controller 做什么并不重要。重要的是它正在使用新的 .net 4.5 async/await 支持等待异步任务。

问题:如何让它在指定的持续时间后超时?我不一定要取消任务,我只是想防止调用者永远挂断。 (不过,我对两种方式都感兴趣。)

最佳答案

我在 LINQPad 中制作了一个带有“C# 程序”选项的版本 - 它编译并运行并输出 2 行,同时显示超时和成功案例:

Timeout of 00:00:05 expired

Successfully got result of foo

这是片段:

void Main()
{
CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10)).Wait();
CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0)).Wait();
}

public async Task CallGetStringWithTimeout(TimeSpan callTimeout, TimeSpan callAddedDelay)
{
var myTask = GetStringAsync(callAddedDelay);
await Task.WhenAny(Task.Delay(callTimeout), myTask);
if (myTask.Status == TaskStatus.RanToCompletion)
{
Console.WriteLine ("Successfully got result of {0}", await myTask);
}
else
{
Console.WriteLine ("Timeout of {0} expired", callTimeout);
}
}

public async Task<string> GetStringAsync(TimeSpan addedDelay)
{
await Task.Delay(addedDelay);
return "foo";
}

但是,“正常”方式是使用 CancellationTokenSource并将超时指定为 the ctor param .如果你已经有一个 CancellationTokenSource,你可以调用 the CancelAfter method在上面,它将安排指定超时的取消。

关于.net - 超时后如何取消异步 WebApi 操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12047176/

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