我有一个接收消息并将它们发送到实例的服务 我收到的每条消息都将其发送到新任务,因此处理该消息的操作将是异步的
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#能够管理它自己的线程池......
答案 0 :(得分:0)
可以同时运行的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