我有一些代码需要“解雇并忘记”,因为调用代码不需要等待响应。
如果我要迭代一个循环并在一秒钟内调用10,000次,我会有10,000个线程浮动,争夺资源吗?我的机器噩梦瞬间变慢了。
或者,线程池是否管理这些请求,并将它们排队等待解决?
换句话说,用Task.Run()
做一些愚蠢的事情是多么容易。
答案 0 :(得分:3)
因此,当您调用Task.Run
时,它会创建一个新的Task
并在TaskScheduler.Default
上安排它。恰好是ThreadPoolTaskScheduler
,然后将该任务排队到ThreadPool
。 ThreadPool
使用一个线程池(令人惊讶地)慢慢浏览工作项。 ThreadPool
在内部管理自己的线程,并在需要时创建更多这些线程。
问题:
我会有10,000个线程浮动,争夺资源吗?
不,ThreadPool
通常知道如何有效地管理其线程并且增长非常缓慢。
但是,你会分配很多任务,等待占用空间直到完成。他们也可能会保留其他参考资料(通常是因为捕获),这也会占用资源。
顺便说一句,如果您使用Task.Run
而不是更安全的Task.Factory.StartNew
而传递TaskCreationOptions.LongRunning
,那么将创建10,000个后台主题。
答案 1 :(得分:1)
当您调用Task.Run时,您正在排队工作以在线程池中运行。如果您开始大量工作,可能需要一段时间才能完成,因为您的计算资源有限。使用Task.Run运行后台任务时,很容易咬自己。最好了解方案并使用正确的工具来完成工作。如果您正在寻找处理大量后台工作,请查看TPL,BlockingCollection和Concurrent Collections等内容。像生产者/消费者流动这样的东西是正确的方向,但都取决于你想要解决的问题。