Mat*_*int 3 .net async-await .net-4.5 asp.net-4.5 asp.net-web-api
使用ASP.Net WebAPI,我有一个控制器,其异步操作类似于以下内容:
[HttpPost]
public async Task<string> DoSomething(string foo)
{
var result = await MyAsynchronousTask(foo);
return result;
}
Run Code Online (Sandbox Code Playgroud)
这个控制器的作用并不重要.重要的是它正在等待使用新的.net 4.5 async/await支持的异步任务.
问题:如何在指定的持续时间后告诉它超时?我不一定要取消任务,我只是想阻止来电者永远挂掉.(虽然,我有兴趣两种方式都看到它.)
我在LINQPad中创建了一个带有'C#Program'选项的版本 - 它编译并运行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";
}
Run Code Online (Sandbox Code Playgroud)
但是,"正常"方式是使用CancellationTokenSource并将超时指定为ctor参数.如果您已经有CancellationTokenSource,则可以在其上调用CancelAfter方法,该方法将为指定的超时安排取消.
| 归档时间: |
|
| 查看次数: |
2642 次 |
| 最近记录: |