我们正在设计一个应用程序,用户可以设置同时运行的多个任务。我们使用ThreadPool.QueueUserWorkItem来设置正在运行的任务。那部分运行良好。
我们确实遇到这些任务可能消耗500MB +内存的问题。我们使用内存映射I / O来管理内存。当用户设置10个以上的任务同时运行时,线程池将启动所有这些任务,并且有时我们会耗尽内存并发生异常。我们可以很好地处理错误。
我想知道的是,是否有办法在处理队列时占用将要消耗的内存,即保持任务排队直到存在足够的内存?我可以通知线程池我们将要求多少内存(我们可以粗略估计)?
答案 0 :(得分:0)
ThreadPool对您在任务中的操作一无所知。你需要自己确保这一点。您可以管理long类型的全局变量,表示所有正在运行的作业在峰值时可能需要的总字节数。当线程池调度您的任务之一时,首先检查该变量。 如果已经太高,则等到当前正在运行的任务已退出。然后再次检查。
对此的低技术解决方案是使用100毫秒睡眠间隔的轮询。高科技版本会使用某种涉及事件的等待方案。
答案 1 :(得分:0)
好的,如果你可以得到每个任务的内存估计,你可以通过在池中保持一个粗略的CS保护内存使用计数来做到这一点。在提交任务之前添加到此计数并让任务调用“memRelease”'函数在它结束之前从它中减去并检查是否可以运行任何东西,(见下文)。
如果某个线程想要提交任务并找到它(通过将其需求与CS中的当前使用情况进行比较),那么“预算”中剩余的内存不足。要运行它,你可以将它推入一个并发的队列/列表,等到有。每当任务完成并调用“memRelease”时,它就会添加到内存buget并迭代队列/列表(首先将其锁定),以尝试查找现在可以使用增加的可用内存运行的内容。如果是,则将任务提交到池中。
答案 2 :(得分:0)
您可以通过ThreadPool.SetMaxThreads控制线程池中的线程数。所以你可以做的是设置你的最大线程数
ThreadPool.SetMaxThreads = new PerformanceCounter("Memory", "Available MBytes").RawValue / 500;
PerformanceCounter(“Memory”,“Available MBytes”)。RawValue - >以MB为单位返回可用内存