C# 穿大量的线

C# 穿大量的线,c#,multithreading,C#,Multithreading,我循环了大约20000次。每次循环时,我都创建一个新线程。线程基本上调用一个方法。这个方法相当慢,需要四秒钟才能完成。它出去刮了一些我们有权刮的页面。我在循环中添加了一秒钟的延迟,这将确保一次只废弃4页。我的问题是,一旦方法完成,线程会发生什么 Thread.Sleep(1000); Thread t = new Thread(() => scraping(asin.Trim(), sku.Trim())); t.Start(); 它退出并被摧毁。 也许你会对使用线程池更感兴趣,并将其最

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

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

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


它将重用相同的线程来执行任务,因为构建新线程需要为它们的堆栈分配新内存,特别是如果您执行了20000次,这可能是您的瓶颈之一。

它退出并被销毁。 也许你会对使用线程池更感兴趣,并将其最大线程数设置为4


它将重用相同的线程来执行任务,因为构建新线程需要为它们的堆栈分配新内存,特别是如果您执行了20000次,这可能是您的瓶颈之一。

它会被操作系统收集并丢弃。你最好还是带上它。这将重复使用线程,因此您不必承担20000次的安装/拆卸成本。

它会被操作系统收集和丢弃。你最好还是带上它。这将重复使用线程,因此您不必承担20000次的安装/拆卸成本。

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


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

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

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

我的问题是,一旦方法完成,线程会发生什么

Thread.Sleep(1000);
Thread t = new Thread(() => scraping(asin.Trim(), sku.Trim()));
t.Start();
一旦该方法完成,它将被销毁

尽管如此,这不是一个理想的方法。您应该使用线程池来避免创建许多线程

<>而不是使用新线程,请考虑使用TyeRoPo.QueReUsWorkWork项来启动任务。

此外,如果您使用的是.NET 4,则可以使用Parallel.ForEach并行循环整个集合。默认情况下,这将使用线程池安排所有任务

最后,您可能应该消除Thread.Sleep在您的循环中-它只会减慢整个操作,并且在您切换到使用ThreadPool后可能不会给您带来任何好处

我的问题是,一旦方法完成,线程会发生什么

Thread.Sleep(1000);
Thread t = new Thread(() => scraping(asin.Trim(), sku.Trim()));
t.Start();
一旦该方法完成,它将被销毁

尽管如此,这不是一个理想的方法。您应该使用线程池来避免创建许多线程

<>而不是使用新线程,请考虑使用TyeRoPo.QueReUsWorkWork项来启动任务。

此外,如果您使用的是.NET 4,则可以使用Parallel.ForEach并行循环整个集合。默认情况下,这将使用线程池安排所有任务


最后,您可能应该消除线程。在循环中睡眠-它只会减慢整个操作,并且在您切换到使用线程池后可能不会为您带来任何收益。

您是否使用线程池?这将决定线程在完成其工作后如何处理。@糟糕,我不是。我将更新我的帖子以包含一些代码。您是否使用线程池?这将决定线程在完成其工作后如何处理。@糟糕,我不是。我将更新我的帖子以包含一些代码。我不确定是否要使用ThreadPool。瓶颈实际上是30 Mbps的互联网连接。+1,我会在重置后回来……今天我已经输掉了所有的选票@Joe-即便如此,要求运行时生成和销毁这么多线程将对承载应用程序的任何硬件造成严重打击。您的问题似乎定义得很好,可以进行优化。我不确定是否要使用ThreadPool。瓶颈实际上是30 Mbps的互联网连接。+1,我会在重置后回来……今天我已经输掉了所有的选票@Joe-即便如此,要求运行时生成和销毁这么多线程将对承载应用程序的任何硬件造成严重打击。您的问题似乎定义得很好,您可以进行优化。这里只是一个猜测,但由于这项工作是针对远程服务器的,所以他很可能是throt
调整线程以防止滥用web主机。@恶心:这是可能的-尽管没有足够的信息可以确定。在这种情况下,可能还有比Thread.Sleep更好的方法……这里只是一个猜测,但由于这项工作是针对远程服务器的,所以他可能会限制线程以防止滥用web主机。@恶心:这是可能的,尽管没有足够的信息可以确定。在这种情况下,可能还有比线程更好的方法。睡眠。。。