【问题标题】:How to cancel an async WebApi action after timeout?超时后如何取消异步 WebApi 操作?
【发布时间】:2012-08-16 08:16:45
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    00:00:05 超时

    成功得到 foo 的结果

    这是sn-p:

    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,它会在指定的超时时间内安排取消。

    【讨论】:

    • 这不起作用,因为我有一个 Task 并且 Task.Delay 只是一个任务。我需要以某种方式包装它。想法?
    • 我想我明白了。 Task.Delay(timeout).ContinueWith(x=> null) 似乎有效。这是一种合理的方法,还是有更清洁的方法?
    • 不确定为什么需要包装它 - Task.WhenAny 会很好,只是将其视为非通用任务。如果状态显示它运行良好,那么您可以访问 Result 属性,或等待它,或其他任何方式(您的条件是它已完成,所以不用担心阻塞)
    • 我会将其充实为一个更完整的示例,希望对您有所帮助。 :)
    • 试试看。如果没有 .ContinueWith(x=>null) 它将无法编译。非泛型 Task 和泛型 Task 之间的类型不匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多