使用ASP.Net WebAPI,我有一个控制器,其异步操作类似于以下内容:
[HttpPost]
public async Task<string> DoSomething(string foo)
{
var result = await MyAsynchronousTask(foo);
return result;
}
这个控制器的作用并不重要。重要的是它正在等待使用新的.net 4.5 async / await支持的异步任务。
问题:如何告知它在指定的持续时间后超时?我不一定要取消任务,我只是想阻止来电者永远挂掉。 (虽然,我有兴趣两种方式看待它。)
答案 0 :(得分:7)
我使用'C#Program'选择在LINQPad中创建了一个版本 - 它编译并运行2行输出,显示超时和成功案例:
超时00:00:05已过期
成功获得了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,这将安排取消指定的超时。