当您在控制器中使用Async / Await时,是否必须从AsyncController继承?如果使用Controller,它是否真的不是异步的? Asp.net web api怎么样?我不认为有AsyncApiController。目前我只是继承了控制器及其工作,但它真的是异步吗?
答案 0 :(得分:6)
MVC 4中AsyncController
类的XML注释
提供与ASP.NET MVC 3的向后兼容性。
班级本身是空的。
换句话说,你不需要它。
答案 1 :(得分:0)
就Web API而言,您不需要Async控制器基类。您需要做的就是将返回值包装在Task中。
例如,
/// <summary>
/// Assuming this function start a long run IO task
/// </summary>
public Task<string> WorkAsync(int input)
{
return Task.Factory.StartNew(() =>
{
// heavy duty here ...
return "result";
}
);
}
// GET api/values/5
public Task<string> Get(int id)
{
return WorkAsync(id).ContinueWith(
task =>
{
// disclaimer: this is not the perfect way to process incomplete task
if (task.IsCompleted)
{
return string.Format("{0}-{1}", task.Result, id);
}
else
{
throw new InvalidOperationException("not completed");
}
});
}
此外,在.Net 4.5中,您可以从await-async中受益,编写更简单的代码:
/// <summary>
/// Assuming this function start a long run IO task
/// </summary>
public Task<string> WorkAsync(int input)
{
return Task.Factory.StartNew(() =>
{
// heavy duty here ...
return "result";
}
);
}
// GET api/values/5
public async Task<string> Get(int id)
{
var retval = await WorkAsync(id);
return string.Format("{0}-{1}", retval, id);
}