c# - 呼叫后几秒钟运行的任务
问题描述
我有一个接收消息并将它们发送到实例的服务,我收到的每条消息我都将其发送到新任务,因此处理消息的操作将是异步的
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数量有限,查看属性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
推荐阅读
- scala - 不在斯卡拉火花之间
- amazon-web-services - etcdctl 抛出错误:超出上下文期限错误
- php - Polylang 语言检测重定向与 301
- asp.net - 文件“/test.aspx”不存在。CheckVirtualFileExists 异常
- node.js - 使用 Angular 可观察对象订阅来自 Node 的分块字符串数据,以便在块交付后立即显示它
- unit-testing - JMockit 可以用任何参数模拟构造函数吗?
- excel - 如何从单个 Excel 单元格中删除重复值
- php - AWS SQS 消息未收到自动
- python - 使用 zmq 创建客户端时,`tempfile.NamedTemporaryFile` 的目的是什么?
- mysql - mysql shell 无法指定数据库,显示用法