2016-10-27 55 views
1

在我的应用程序中,我接收消息和调用的事件。事件是在库中定义的,所以我只能订阅。.NET中的任务管理

consumer.Received += (model, ea) => new Task(() => 
{ 
    var body = ea.Body; 
    var message = Encoding.UTF8.GetString(body); 
    Console.WriteLine(message); 
}).Start(); 

我收到消息时运行新的任务。但是,它可能是非常大量的消息和正在运行的任务。我想,当我使用新的Task().Start()它会立即开始,所以我的系统可能会超载。问题是:如何管理任务,而无需创建具有固定数量运行任务的容器,因为我想使用最多的功能和信任管理.NET。谢谢。

回答

1

这里,任务排队到线程池并基于其启发式执行。

信任管理,.NET

是啊...运行时有什么任务调度是最优的有限的信息。有时你需要控制。特别是,如果你在做IO。我对CPU限制的工作负载的经验不多,但是对于默认调度,他们应该更加合适。

很难推荐具体的东西,因为不清楚代表样本代码的实际工作量。如果这是基于IO的,那么绝对不应该依赖线程池启发式。 TPL不知道你的IO设备可以做什么。

在这里,由于您不使用异步IO(在示例代码中),如果您想要控制,可以使用TaskScheduler抽象来创建具有有限并行度的任务调度程序。

你可能是最好的测试一个现实的工作量。如果您发现创建的线程太多,您可以将并行度限制为理智的值。