所以我循环将循环大约20000次。每次循环时,我都会创建一个新线程。线程基本上调用一个方法。该方法相当慢,需要四秒钟才能完成。它出去并刮擦一些页面(我们有权抓取)。我在循环中添加了一秒钟的延迟,这样可以确保一次只有4页被废弃。我的问题一旦方法完成后该线程会发生什么?
Thread.Sleep(1000);
Thread t = new Thread(() => scraping(asin.Trim(), sku.Trim()));
t.Start();
答案 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
,则会将其返回到池中。如果您确切知道在任何给定时间计划保持活动的线程数,您可以使用该数字创建一个池以节省一些开销。