0

我是第一次用线程编程。我的程序一次只显示少量数据;当用户浏览数据时,我希望它加载所有可能接下来可以访问的数据,因此当用户切换到新部分时,延迟尽可能小。

最坏的情况我可能需要预加载 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#,这是一个可移植类库项目,所以我的一些选择是有限的。

4

1 回答 1

0

我将使用这个内置的 .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);
});

如果需要,您甚至可以使用 Extensions 来实现:

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);
于 2013-07-29T19:20:00.083 回答