使用IIS托管WCF服务的C#中的任务管理

使用IIS托管WCF服务的C#中的任务管理,c#,multithreading,wcf,task-parallel-library,task,C#,Multithreading,Wcf,Task Parallel Library,Task,我在IIS中托管了32位版本的WCF服务。其中,我使用以下方法创建任务以并行执行我的操作(处理数据库计算或向第三方进行外部调用) List taskList=new List(); Task parentTask=Task.Factory.StartNew(()=> { 对于(int i=0;i Do(),TaskCreationOptions.AttachedToParent); 任务列表。添加(任务); } }); foreach(任务列表中的任务t) { t、 Start(); } par

我在IIS中托管了32位版本的WCF服务。其中,我使用以下方法创建任务以并行执行我的操作(处理数据库计算或向第三方进行外部调用)

List taskList=new List();
Task parentTask=Task.Factory.StartNew(()=>
{
对于(int i=0;i Do(),TaskCreationOptions.AttachedToParent);
任务列表。添加(任务);
}
});
foreach(任务列表中的任务t)
{
t、 Start();
}
parentTask.Wait(20000);
使用上述代码,我创建了大约140个任务,只需向我的服务发出一个请求。我的应用程序每秒大约有10个请求

我面临的问题是,大多数任务在父线程等待执行繁重的操作之前没有执行,那么任务没有获得足够的CPU意味着没有在并行任务中调用

我只是想知道处理多线程的最好方法是什么。我曾经读过很多文章,Task.Factory.StartNew总是使用线程池的概念,为什么我的任务在高并发请求下启动和运行需要20秒以上的时间

在本例中,我假设所有操作都在父级等待结束之前完成。这是取消任务而不是等待的最佳方式吗

32位应用程序和64位应用程序是否对带有任务管理的.Net framework 4.0有重大影响

提前谢谢

总有“最好的办法”。在你的情况下,试试看

taskList.WaitAll();而不是parentTask。等待(20000)

总有“最好的办法”。在你的情况下,试试看


taskList.WaitAll();而不是parentTask。等待(20000)

关于你的第二个问题:

32位应用程序和64位应用程序是否对带有任务管理的.Net framework 4.0有重大影响

答案是否定的。任务是在线程池线程上执行的。无论CPU运行的是32位还是64位进程,它都可以一次执行一个线程。可以调整线程池的大小,但不建议这样做。NET framework通过一个复杂的计算来确定线程池的大小,这个计算基于CPU/内核的数量、时钟速度和一些其他参数


一次执行太多线程是没有效率的,因为在线程之间管理和切换需要资源。如果有一堆CPU占用的线程都在排队,那么在它们之间来回切换会消耗大量的CPU时间,而且永远不会完成任何工作(就像每10分钟就有7个项目经理在你的办公桌旁询问状态更新),导致在请求更多工作时创建更多线程,直到服务器以100%的速度停止运行。

关于第二个问题:

32位应用程序和64位应用程序是否对带有任务管理的.Net framework 4.0有重大影响

答案是否定的。任务是在线程池线程上执行的。无论CPU运行的是32位还是64位进程,它都可以一次执行一个线程。可以调整线程池的大小,但不建议这样做。NET framework通过一个复杂的计算来确定线程池的大小,这个计算基于CPU/内核的数量、时钟速度和一些其他参数


一次执行太多线程是没有效率的,因为在线程之间管理和切换需要资源。如果有一堆CPU占用的线程都在排队,那么在它们之间来回切换会消耗大量的CPU时间,而且永远不会完成任何工作(就像每10分钟就有7个项目经理在你的办公桌旁询问状态更新),导致在请求更多工作时创建更多线程,直到您的服务器以100%的速度停止运行。

因为父任务应该等待子任务,所以您应该使用任务类的
WaitAll
方法,等待所有提供的任务对象完成执行

创建示例程序以演示相同的功能:

using System;
using System.Threading.Tasks;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {   
        Console.WriteLine("Starting Parent Task");
         List<Task> taskList = new List<Task>();
         Task parentTask = Task.Factory.StartNew(() =>
         {
            for (int i = 0; i <= 5; i++)
            {
                var task = new Task(() => Console.WriteLine("Task Running : " + Task.CurrentId), TaskCreationOptions.AttachedToParent);
                taskList.Add(task);
            }

            foreach (Task t in taskList)
            {
                t.Start();
            }

            Task.WaitAll(taskList.ToArray());

         });


        Console.WriteLine("Parent Task Ending");

    }
}
使用系统;
使用System.Threading.Tasks;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{   
Console.WriteLine(“启动父任务”);
List taskList=新列表();
Task parentTask=Task.Factory.StartNew(()=>
{
对于(int i=0;i Console.WriteLine(“正在运行的任务:+Task.CurrentId”)、TaskCreationOptions.AttachedToParent);
任务列表。添加(任务);
}
foreach(任务列表中的任务t)
{
t、 Start();
}
Task.WaitAll(taskList.ToArray());
});
Console.WriteLine(“父任务结束”);
}
}

创建了dotnetfiddle。您可以在fiddle中检查它的输出。

因为父任务应该等待子任务,所以您应该使用task类的
WaitAll
方法,该方法等待所有提供的任务对象完成执行

创建示例程序以演示相同的功能:

using System;
using System.Threading.Tasks;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {   
        Console.WriteLine("Starting Parent Task");
         List<Task> taskList = new List<Task>();
         Task parentTask = Task.Factory.StartNew(() =>
         {
            for (int i = 0; i <= 5; i++)
            {
                var task = new Task(() => Console.WriteLine("Task Running : " + Task.CurrentId), TaskCreationOptions.AttachedToParent);
                taskList.Add(task);
            }

            foreach (Task t in taskList)
            {
                t.Start();
            }

            Task.WaitAll(taskList.ToArray());

         });


        Console.WriteLine("Parent Task Ending");

    }
}
使用系统;
使用System.Threading.Tasks;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{   
Console.WriteLine(“启动父任务”);
List taskList=新列表();
Task parentTask=Task.Factory.StartNew(()=>
{
对于(int i=0;i Console.WriteLine(“正在运行的任务:+Task.CurrentId”)、TaskCreationOptions.AttachedToParent);
任务列表。添加(任务);
}
foreach(任务列表中的任务t)
{
t、 Start();
}
Task.WaitAll(taskList.ToArray