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

4

1 回答 1

1

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

这是一个小错误:

我假设原来的工作线程正在等待这个 UploadFromStream 完成?

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

于 2013-02-09T09:04:26.970 回答