异步/等待和异步控制器?

4

当你在控制器中使用Async/Await时,是否必须从AsyncController继承才能实现真正的异步?如果使用Controller,是否仍然是异步的?Asp.net web api呢?我认为没有AsyncApiController。目前我只是从controller继承,并且它可以工作,但它是否真正是异步的呢?


请查看我的教程 http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4 - RickAndMSFT
2个回答

6

MVC 4中AsyncController类的XML注释如下:

为了与ASP.NET MVC 3向后兼容而提供。

这个类本身是空的。

换句话说,你不需要它。


0
关于Web API,您不需要一个异步控制器基类。您所需要做的就是将返回值包装在一个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);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接