当前位置: 首页 > 编程语言 > C#

ThreadPool.QueueUserWorkItem中的最大队列元素分享

时间:2023-04-10 21:49:09 C#

ThreadPool.QueueUserWorkItem中的最大队列元素我将最大线程设置为10。然后我使用ThreadPool.QueueUserWorkItem添加了22000个任务。运行该程序后,很可能并非所有22000个任务都已完成。有多少任务可以排队等待一个可用线程?队列没有真正的限制,但池本身永远不会超过64个等待句柄,即总线程活动。如果您需要等待所有任务处理完毕,您需要自己处理。ThreadPool线程都是后台线程,不会让应用程序保持活动状态。这是处理这种情况的一种相对简洁的方法:使用(varmre=newManualResetEvent(false)){intremainingToProcess=workItems.Count();//假设workItems是“任务”的集合foreach(variteminworkItems){//下面的委托闭包(在C#4和更早版本中)将//捕获对“item”的引用,从而导致//发送的项目不正确到ProcessTask每次迭代。改用“item”变量的本地副本。//C#5/VS2012将不需要这里的本地。varlocalItem=项目;线程池。QueueUserWorkItem(delegate{//将其替换为您的“工作”ProcessTask(localItem);//这将(安全地)减少剩余计数,并允许主线程在我们完成后继续if(Interlocked.Decrement(refremainingToProcess)==0)mre.Set();});}mre.WaitOne();话虽如此,如果您有数千个工作项,通常最好将它们“组合”在一起,而不是将它们视为线程池的单独工作项。这是管理项目列表所涉及的一些开销,并且由于您不能一次处理22000个,所以最好将它们组合成块。每个进程50个左右的单个工作项可能会对您的整体吞吐量有很大帮助……这是一个依赖于实现的问题,并且此功能的实现随着时间的推移发生了一些变化。但在.Net4.0中,由于任务存储在内存队列中,您基本上会受到系统内存量的限制。您可以通过深入研究Reflector中的实现来了解这一点。来自ThreadPool文档:注意:托管线程池中的线程是后台线程。也就是说,它们的IsBackground属性为真。这意味着ThreadPool线程不会在所有前台线程退出后保持应用程序运行。是否有可能在所有任务处理完之前就退出?以上就是C#学习教程的全部内容:ThreadPool.QueueUserWorkItem中的最大队列元素。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: