在MVC 4 async ApiController中使用Task.Factory.StartNew?

时间:2013-02-09 07:42:53

标签: multithreading c#-4.0 asynchronous asp.net-mvc-4 asp.net-web-api

我正在使用MVC4 ApiController将数据上传到Azure Blob。以下是示例代码:

public Task PostAsync(int id)
{
    return Task.Factory.StartNew(() => 
    {
        // CloudBlob.UploadFromStream(stream);
    });
}

这段代码是否有意义?我认为ASP.NET已经在工作线程中处理请求,因此在另一个线程中运行UploadFromStream似乎没有意义,因为它现在使用两个线程来运行此方法(我假设原始工作线程正在等待此UploadFromStream完成?)

所以我的理解是,如果我们使用一些内置的异步方法,例如HttpClient.GetAsync或SqlCommand.ExecuteReaderAsync,async ApiController才有意义。这些方法可能在内部使用I / O完成端口,因此它可以在执行实际工作时释放线程。所以我应该把代码改成这个?

public Task PostAsync(int id)
{
    // only to show it's using the proper async version of the method.
    return TaskFactory.FromAsync(BeginUploadFromStream, EndUploadFromStream...)
}

另一方面,如果Post方法中的所有工作都是CPU /内存密集型,那么异步版PostAsync将无法帮助请求吞吐量。最好只使用常规的“public void Post(int id)”方法,对吧?

我知道这是很多问题。希望它能澄清我对ASP.NET MVC中异步使用的理解。感谢。

1 个答案:

答案 0 :(得分:1)

是的,你说的大多数都是正确的。甚至到完成端口等细节。

这是一个很小的错误:

  

我假设原始工作线程正在等待此UploadFromStream完成?

只有您的任务线程正在运行。毕竟你正在使用异步管道。它不等待任务完成,它只是连接一个延续。 (就像HttpClient.GetAsync一样)。