如何从资源管理角度处理对Task.Run的多个请求?

时间:2015-06-07 20:20:29

标签: c# .net multithreading asynchronous task-parallel-library

我有一些代码需要“解雇并忘记”,因为调用代码不需要等待响应。

如果我要迭代一个循环并在一秒钟内调用10,000次,我会有10,000个线程浮动,争夺资源吗?我的机器噩梦瞬间变慢了。

或者,线程池是否管理这些请求,并将它们排队等待解决?

换句话说,用Task.Run()做一些愚蠢的事情是多么容易。

2 个答案:

答案 0 :(得分:3)

因此,当您调用Task.Run时,它会创建一个新的Task并在TaskScheduler.Default上安排它。恰好是ThreadPoolTaskScheduler,然后将该任务排队到ThreadPoolThreadPool使用一个线程池(令人惊讶地)慢慢浏览工作项。 ThreadPool在内部管理自己的线程,并在需要时创建更多这些线程。

问题:

  

我会有10,000个线程浮动,争夺资源吗?

不,ThreadPool通常知道如何有效地管理其线程并且增长非常缓慢。

但是,你分配很多任务,等待占用空间直到完成。他们也可能会保留其他参考资料(通常是因为捕获),这也会占用资源。

顺便说一句,如果您使用Task.Run而不是更安全的Task.Factory.StartNew而传递TaskCreationOptions.LongRunning,那么创建10,000个后台主题。

答案 1 :(得分:1)

当您调用Task.Run时,您正在排队工作以在线程池中运行。如果您开始大量工作,可能需要一段时间才能完成,因为您的计算资源有限。使用Task.Run运行后台任务时,很容易咬自己。最好了解方案并使用正确的工具来完成工作。如果您正在寻找处理大量后台工作,请查看TPL,BlockingCollection和Concurrent Collections等内容。像生产者/消费者流动这样的东西是正确的方向,但都取决于你想要解决的问题。