【发布时间】:2015-03-31 18:13:31
【问题描述】:
这是一个 .ashx 处理程序,它创建一系列 Task 对象,然后在 foreach 循环中执行。
List<Task<Action>> list = new List<Task<Action>>();
list.Add(Task.Factory.StartNew<Action>(() => AddHeader(graphics, request, reportParameters)));
list.Add(Task.Factory.StartNew<Action>(() => AddSubmitter (graphics, request, reportParameters)));
list.Add(Task.Factory.StartNew<Action>(() => AddActivity(graphics, request, reportParameters)));
list.Add(Task.Factory.StartNew<Action>(() => AddCharts(graphics, request, reportParameters)));
//Task.WaitAll(list.ToArray()); //AY - This seems unnecessary
foreach (var action in list.Select(t => t.Result))
{
action();
}
每个返回 Action 的方法都会像下面的第一个方法一样执行 CPU 密集型工作。
private Action AddHeader(XGraphics graphics, HttpRequest request, ReportParameters reportParameters)
{
DataSet ds = new myData().ClientHeader(reportParameters);
// This will be a function waiting to be called.
return () =>
{
// Some CPU intensive operation code here.
};
}
有人可以帮我理解这段代码是否有用吗 1)从异步或多任务的角度来看? 2) 这段代码是否甚至从 ASP.NET 线程池中创建了多个线程?
当我调试应用程序时,它会在运行 foreach 循环之前在我的机器上显示 4 个单独的任务。这些任务中的每一个都检索数据集,我认为这是因为每个方法中的那部分代码在 return () Action 语句之前运行。
那么这段代码的全部目的是在执行每个 CPU 密集型操作方法之前在单独的任务中启用多个数据库调用吗?或者代码真的在做异步的事情吗?
【问题讨论】:
-
在 asp.net 中使用任务异步模式有一个好处——工作负载显然被转移到了应用程序池之外的线程上,这意味着您可以获得更多的并发性和更多的会话。不确定这与您的具体实施有何关系,因此仅发表评论。
-
@kidshaw 不,在 ASP.NET 中使用异步模式的主要好处是允许您使用更少的线程,而不是使用不同的线程。这允许线程池将更多时间花在生产性工作、处理请求上,而不是非生产性工作,比如坐等 IO。
标签: c# asp.net multithreading async-await task-parallel-library