我正在使用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中异步使用的理解。感谢。
答案 0 :(得分:1)
是的,你说的大多数都是正确的。甚至到完成端口等细节。
这是一个很小的错误:
我假设原始工作线程正在等待此UploadFromStream完成?
只有您的任务线程正在运行。毕竟你正在使用异步管道。它不等待任务完成,它只是连接一个延续。 (就像HttpClient.GetAsync一样)。