1

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

这里有什么更好的选择?

4

1 回答 1

2

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

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

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

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

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

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

于 2013-05-16T08:55:49.520 回答