3

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

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

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

问题:如何告诉它在指定的持续时间后超时?我不一定要取消任务,我只是想防止调用者永远挂断。(虽然,我有兴趣从这两种方式看到它。)

4

1 回答 1

7

我在 LINQPad 中使用“C# 程序”选项制作了一个版本 - 它编译并运行时输出 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并将超时指定为ctor param。如果你已经有一个 CancellationTokenSource,你可以调用它的 CancelAfter 方法,它会在指定的超时时间内安排取消。

于 2012-08-21T01:05:06.180 回答