【问题标题】:Use Task.Factory.StartNew in MVC 4 async ApiController?在 MVC 4 异步 ApiController 中使用 Task.Factory.StartNew?
【发布时间】:2013-02-09 07:42:52
【问题描述】:

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

【问题讨论】:

    标签: multithreading c#-4.0 asynchronous asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

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

    这是一个小错误:

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 2017-01-11
      • 1970-01-01
      • 2022-11-30
      相关资源
      最近更新 更多