在MVC 4的异步ApiController中使用Task.Factory.StartNew?

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

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中使用异步的理解。谢谢。
1个回答

1

是的,你说的大部分都是正确的,甚至包括完成端口等细节。

这里有一个小错误:

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

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


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