Hen*_*gyi 5 multithreading asynchronous c#-4.0 asp.net-mvc-4 asp.net-web-api
我正在使用MVC4 ApiController将数据上传到Azure Blob.以下是示例代码:
public Task PostAsync(int id)
{
return Task.Factory.StartNew(() =>
{
// CloudBlob.UploadFromStream(stream);
});
}
Run Code Online (Sandbox Code Playgroud)
这段代码甚至有意义吗?我认为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...)
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果Post方法中的所有工作都是CPU /内存密集型,那么异步版本PostAsync将无助于请求的吞吐量.最好只使用常规的"public void Post(int id)"方法,对吗?
我知道这是很多问题.希望它能澄清我对ASP.NET MVC中异步使用的理解.谢谢.
是的,你说的大部分都是对的。甚至到完成端口等细节。
这是一个小错误:
我假设原始工作线程正在等待此 UploadFromStream 完成?
只有您的任务线程正在运行。毕竟您正在使用异步管道。它不会等待任务完成,它只是连接一个延续。(就像 HttpClient.GetAsync 一样)。
归档时间: |
|
查看次数: |
1372 次 |
最近记录: |