【发布时间】:2015-10-21 17:47:01
【问题描述】:
我在 IIS 中托管了 32 位版本的 WCF 服务。其中,我使用以下方法创建任务以并行执行我的操作(进行数据库计算或对第三方进行外部调用)。
List<Task> taskList = new List<Task>();
Task parentTask = Task.Factory.StartNew(() =>
{
for (int i = 0; i <= 5; i++)
{
var task = new Task(() => Do(), TaskCreationOptions.AttachedToParent);
taskList.Add(task);
}
});
foreach (Task t in taskList)
{
t.Start();
}
parentTask.Wait(20000);
使用上面的代码,我创建了大约 140 个任务,对我的服务提出了一个请求。我的应用程序每秒大约有 10 个请求。
我面临的问题是,在我的父线程等待执行繁重的操作时,大多数任务都没有执行,然后任务没有获得足够的 CPU 意味着不调用并行任务。
我只想知道处理多线程的最佳方式。我遇到过很多文章,Task.Factory.StartNew 总是使用线程池概念,为什么我的任务在高并发请求的情况下启动和运行需要超过 20 秒的时间。
在这种情况下,我假设所有操作都在父级等待之前完成。这是取消任务而不是等待的最佳方式吗?
32 位应用程序和 64 位应用程序对带有任务管理的 .Net framework 4.0 有重大影响吗?
提前致谢!!
【问题讨论】:
-
没有看得太仔细,但也许用 Task.WaitAll(taskList) 替换 parentTask.Wait(20000) 是你所追求的。在这种情况下,可能不需要您的 parentTask 实例。
标签: c# multithreading wcf task-parallel-library task