首页 > 解决方案 > 呼叫后几秒钟运行的任务

问题描述

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

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# 能够管理它自己的线程池......

标签: c#task

解决方案


可以同时运行的Task数量有限,查看属性Task.Factory.Scheduler.MaximumConcurrencyLevel

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

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

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

TheadPool - https://msdn.microsoft.com/en-gb/library/system.threading.threadpool.aspx


推荐阅读