想要限制线程池,使其不会最大化 CPU



我第一次用Threads编程。我的程序一次只显示少量数据;当用户浏览数据时,我希望它加载下一步可以访问的所有可能的数据,这样当用户切换到一个新的部分时,就会有尽可能小的延迟。

在最坏的情况下,我可能需要预加载6段数据。所以我用了一些类似的东西:

if (SectionOne == null)
{
    ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(PreloadSection),
        Tuple.Create(thisSection, SectionOne));
}
if (SectionTwo == null)
{
    ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(PreloadSection),
        Tuple.Create(thisSection, SectionTwo));
}
//....

以预加载每个区域。它在我有8个核心的主系统上运行得很好;但在我只有4个内核的测试系统上,整个系统在运行线程时会慢到爬行。

我想我想同时运行最多2个TotalCores线程。但我真的不知道。

寻求任何帮助,使其在多个系统设置(单核到8核或其他)上尽可能高效地运行。此外,我使用的是C#,这是一个可移植类库项目,所以我的一些选择是有限的。

我会使用这种内置的.NET并行魔法。

任务并行性

使用为您管理的任务操作,但您仍然可以控制选择所需的核心和线程数量。

示例:

const int MAX = 10000;
var options = new ParallelOptions
{
   MaxDegreeOfParallelism = 2
};

IList<int> threadIds = new List<int>();
Parallel.For(0, MAX, options, i =>
{
   var id = Thread.CurrentThread.ManagedThreadId;
   Console.WriteLine("Number '{0}' on thread {1}", i, id);
                    threadIds.Add(id);
});

如果你想的话,你甚至可以用扩展来做:

const int MAX_TASKS = 8;
var numbers = Enumerable.Range(0, 10000000);
IList<int> threadIds = new List<int>(MAX_TASKS);
numbers.AsParallel()
       .WithDegreeOfParallelism(MAX_TASKS)
       .ForAll(i =>
        {
           var id = Thread.CurrentThread.ManagedThreadId;
           if (!threadIds.Contains(id))
           {
               threadIds.Add(id);
           }
        });
 Assert.IsTrue(threadIds.Count > 2);
 Assert.IsTrue(threadIds.Count <= MAX_TASKS);
 Console.WriteLine(threadIds.Count);

最新更新