Async / Await& AsyncController?

时间:2012-10-24 17:34:50

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

当您在控制器中使用Async / Await时,是否必须从AsyncController继承?如果使用Controller,它是否真的不是异步的? Asp.net web api怎么样?我不认为有AsyncApiController。目前我只是继承了控制器及其工作,但它真的是异步吗?

2 个答案:

答案 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);
    }
相关问题