想要限制Threadpool,以便它不会最大化CPU

时间:2013-07-29 19:15:40

标签: c# threadpool portable-class-library

我是第一次使用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个核心,整个系统在运行线程时会慢慢爬行。

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

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

1 个答案:

答案 0 :(得分:0)

我将使用这种内置的.NET并行魔术。

Task Parallelism

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

示例:

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);