如何在超时后取消异步Web Api操作?

时间:2012-08-21 00:59:02

标签: .net asp.net-web-api .net-4.5 async-await asp.net-4.5

使用ASP.Net WebAPI,我有一个控制器,其异步操作类似于以下内容:

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

这个控制器的作用并不重要。重要的是它正在等待使用新的.net 4.5 async / await支持的异步任务。

问题:如何告知它在指定的持续时间后超时?我不一定要取消任务,我只是想阻止来电者永远挂掉。 (虽然,我有兴趣两种方式看待它。)

1 个答案:

答案 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,这将安排取消指定的超时。

相关问题