C# 任务在调用后几秒钟内运行

C# 任务在调用后几秒钟内运行,c#,task,C#,Task,我有一个接收消息并将其发送到实例的服务 我收到的每一条消息都会发送到新任务,因此处理消息的操作将是异步的 public void ReceiveMessage(string Message) { Logger.Logger.Log($"Receive Message {Message} in METHOD method"); //see in the log time stamp 12:13:51.000 Task.Factory.St

我有一个接收消息并将其发送到实例的服务 我收到的每一条消息都会发送到新任务,因此处理消息的操作将是异步的

public void ReceiveMessage(string Message) {
      Logger.Logger.Log($"Receive Message {Message} in METHOD method");  
      //see in the log time stamp 12:13:51.000
                Task.Factory.StartNew(() =>
                {
                    Logger.Logger.Log($"Receive Message  {Message} in TASK method"); 
                    //see in the log time stamp 112:13:53.000

                    processMessage(Message);
                });
}

private void processMessage(string message) {
     //do some processing job
}
服务中接收到来自不同客户端的大量消息,每条消息都发送到不同的实例,
ReceiveMessage
processMessage
是每个实例的方法 因此,在调用方法和启动任务之间有2秒的延迟-有人知道为什么会发生这种情况以及如何避免吗


我认为C#能够管理自己的线程池…

可以并发运行的任务数量有限,请检查
Task.Factory.Scheduler.MaximumConcurrencyLevel的属性

任务并行库和PLINQ的默认调度程序使用.NET Framework线程池(由ThreadPool类表示)来排队和执行工作。线程池使用任务类型提供的信息来有效地支持并行任务和查询通常表示的细粒度并行(短期工作单元)

但是
ThreadPool
池大小取决于几个因素:

每个进程有一个线程池。从.NET Framework 4开始,进程线程池的默认大小取决于几个因素,例如虚拟地址空间的大小。进程可以调用GetMaxThreads方法来确定线程数。可以使用SetMaxThreads方法更改线程池中的线程数。每个线程使用默认堆栈大小并以默认优先级运行


TheadPool-

虽然我无法解释为什么需要2秒钟(除非这只是第一次),但您必须了解,您要求“在将来”运行任务,但无法保证任务何时运行。当池中有一个备用线程时,您的任务将启动,但是如果已经有100个(实际数量取决于许多事情)任务在运行,那么将没有剩余的任务可以运行您的任务(直到其他任务完成)。根据如何避免:滚动您自己的线程池。当然,这会带来复杂性,如果您已经用任务使系统过载,情况可能会变得更糟。嗨,您有一个例子吗?