我是第一次使用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#,这是一个可移植类库项目,因此我的一些选项是有限的。
答案 0 :(得分: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);
});
如果您愿意,甚至可以使用扩展程序:
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);