我正在使用MVC4 ApiController将数据上传到Azure Blob。以下是示例代码:
这段代码有意义吗?我认为ASP.NET已经在工作线程中处理请求,所以在另一个线程中运行UploadFromStream似乎没有意义,因为现在需要使用两个线程来运行此方法(我假设原始工作线程正在等待此UploadFromStream完成?)
因此,我的理解是,只有在使用一些内置的异步方法,如HttpClient.GetAsync或SqlCommand.ExecuteReaderAsync时,异步ApiController才有意义。这些方法可能在内部使用了I/O完成端口,因此可以在执行实际工作时释放线程。所以,我应该将代码更改为以下内容?
另一方面,如果Post方法中的所有工作都是CPU/内存密集型的,则异步版本PostAsync将不会帮助请求吞吐量。最好只使用常规的“public void Post(int id)”方法,对吗? 我知道这是很多问题。希望这能澄清我在ASP.NET MVC中使用异步的理解。谢谢。
:
public Task PostAsync(int id)
{
return Task.Factory.StartNew(() =>
{
// CloudBlob.UploadFromStream(stream);
});
}
这段代码有意义吗?我认为ASP.NET已经在工作线程中处理请求,所以在另一个线程中运行UploadFromStream似乎没有意义,因为现在需要使用两个线程来运行此方法(我假设原始工作线程正在等待此UploadFromStream完成?)
因此,我的理解是,只有在使用一些内置的异步方法,如HttpClient.GetAsync或SqlCommand.ExecuteReaderAsync时,异步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中使用异步的理解。谢谢。