【问题标题】:Synchronous controller with Task.Factory.StartNew versus Asynchronous controller in MVC 4 versus Service Broker Activation具有 Task.Factory.StartNew 的同步控制器与 MVC 4 中的异步控制器与 Service Broker 激活
【发布时间】:2013-05-16 07:49:24
【问题描述】:

我有一个在 .Net 4.0 VS2010 环境中在 MVC 4 中运行的项目。我需要处理一个长时间运行的 sql 任务,而不需要让用户在前端等待那么久。 MVC 4 Web 应用程序调用业务层,该业务层调用数据层方法,该方法使用如下代码 sn-p 执行 SP。

public DataSet ExecuteSP()
{

        dbc = database.GetStoredProcCommand('long_running_sp');
        dbc.CommandTimeout = 300;

        foreach (SPParams p in spParams)
        {
            dbc.Parameters.Add(new SqlParameter(p.ParamName, p.ParamValue));
        }

        DataSet ds = _database.ExecuteDataSet(dbc);

        return ds;
}

我尝试的两个选项是使用明显不起作用的同步控制器,然后另一个是使用异步控制器。我发现在数据层调用存储过程后,这两个选项都挂起了我的网站。然后我在我的 AsyncController 中引入了 Task.Factory.StartNew 方法。有效。然后我在我的同步控制器中应用了同样的方法,它也在那里工作。

现在的问题是:如果我只需要应用 Task.Factory.StartNew,那么为什么还要使用 AsyncController?或者更好的是为什么不完全放弃 Task.Factory.StartNew 并选择 Service Broker Activation

这里有什么更好的选择?

【问题讨论】:

  • 如果您需要返回一个记录集,那么我怀疑 Service Broker 在这里会不会有很大帮助。
  • 不,我没有。它是一个火灾和忘记的情况。将在网站上运行另一个轮询操作,以检查被标记为已完成的作业。

标签: .net sql-server asp.net-mvc asynchronous


【解决方案1】:

AsyncController 和普通控制器的区别在于你可以同时处理更多的请求。

您的情况是一劳永逸的情况。 AsyncController 更适合您有长请求(通常是网络或 I/O 绑定)的情况。虽然从客户端的角度来看,您不会注意到响应时间有任何差异,但服务器级别存在差异。

如果你使用同步控制器,它会阻塞线程。 IIS 在线程池中的可用线程数量有限。如果您阻止线程,则 IIS 可能会用完线程。结果将是其他线程排队,因为你有很多阻塞的线程。使用异步控制器,您可以在这些线程不执行任何操作时释放它们,以便它们可以为其他请求提供服务。

因此,从单个用户的角度来看,响应时间将是相同的,因为您仍然需要等待响应。从多用户的角度来看,总响应时间会更好,因为您可以同时为更多用户提供服务。

如前所述,如果您正在执行即发即弃,则没有理由使用异步控制器,因为您想要的只是触发查询并将结果返回给用户。您应用的方法适合这种情况。

如果您需要将结果返回给用户,最好使用异步控制器,因为这将释放等待线程。 (也就是说,如果它受网络或 IO 限制,因为如果它受 CPU 限制,则根本没有收益)

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 2015-08-24
    • 1970-01-01
    • 2012-07-05
    • 2012-12-07
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多