线程化大量线程

时间:2011-06-16 16:33:02

标签: c# multithreading

所以我循环将循环大约20000次。每次循环时,我都会创建一个新线程。线程基本上调用一个方法。该方法相当慢,需要四秒钟才能完成。它出去并刮擦一些页面(我们有权抓取)。我在循环中添加了一秒钟的延迟,这样可以确保一次只有4页被废弃。我的问题一旦方法完成后该线程会发生什么?

Thread.Sleep(1000);
Thread t = new Thread(() => scraping(asin.Trim(), sku.Trim()));
t.Start();

4 个答案:

答案 0 :(得分:2)

退出并被摧毁。 也许你对使用ThreadPool更感兴趣并将其最大线程数设置为4?

它将重用相同的线程来完成任务,因为构建新线程涉及为其堆栈分配新内存,特别是如果你这样做20000次,它可能是你的瓶颈之一。

答案 1 :(得分:2)

  

我的问题一旦方法完成后该线程会发生什么?

方法完成后会立即销毁。

话虽如此,这不是一个理想的方法。您应该使用ThreadPool来避免创建多个线程。

请考虑使用new Thread开始执行任务,而不是使用ThreadPool.QueueUserWorkItem

此外,如果您使用的是.NET 4,则可以使用Parallel.ForEach同时遍历整个集合。这将使用ThreadPool(默认情况下)来安排所有任务。

最后,您可能应该消除循环中的Thread.Sleep - 它只会减慢整体操作,并且可能不会为您提供任何收益(一旦您切换到使用ThreadPool)。

答案 2 :(得分:1)

操作系统收集并丢弃它。使用ThreadPool.QueueUserWorkItem可能会更好。这将重新使用线程,因此您不必花费20000次设置/拆卸成本。

答案 3 :(得分:1)

根据您编辑的帖子,线程将被销毁并且其资源被收集垃圾。正如@Karim也提到的那样。

如果您使用的是ThreadPool,则会将其返回到池中。如果您确切知道在任何给定时间计划保持活动的线程数,您可以使用该数字创建一个池以节省一些开销。