问候Overflowers,
我正在使用C#.Net 4。
我想优先考虑我的代码的特定部分以利用并发性,而其他部分也可以在有空间(免费核心)时也这样做,否则他们应该切换到顺序执行(在调用程序线程中)而不是暂时受阻。
我怎样才能做到这一点 ?最近有关于该特定问题的最佳读物吗?
如果没有核心可用,那么Parallel.Invoke(...)在调用者任务/线程中按顺序执行东西吗?
此致
答案 0 :(得分:1)
没有“免费线程”这样的东西。只有一个未使用的核心。您可以使用Environment.ProcessorCount简单地计算它们,并以此为基础进行线程化策略。不利用ThreadPool通常是一个错误,它在核心上分配tp线程方面做得很好。但它并不容易给你你所要求的东西,ThreadPool.GetAvailableThreads是一个不断变化的数字。无论如何应该是。
答案 1 :(得分:0)
我的印象是并行框架基于物理可用性分发了线程。 http://msdn.microsoft.com/en-gb/concurrency/default.aspx
我可能会想到并行扩展(http://blogs.msdn.com/b/pfxteam/),或者它们可能是同一个东西,或者我可能在谈论垃圾: - )
答案 2 :(得分:0)
根据我使用F#的经验,可以从核心应用程序代码之外控制/配置并发使用。我希望C#Async CTP能够提供类似的功能。
答案 3 :(得分:0)
自由线程是一种仅存在于.Net线程池中的概念。您的意思可能是免费的CPU资源!?
如果您使用新的Thread()声明自己的线程,则不受它的约束。
然而,产生很多它们可能会减慢过程甚至操作系统。 这就是为什么你应该让自己的线程管理器来处理这个问题。
您可以检查CPU使用情况:
PerformanceCounter cpuCounter = new PerformanceCounter();
cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";
double cpuUsage = Convert.ToDouble(cpuCounter.NextValue());
然后在你的代码中使用变量来执行:
int threadId;
if (cpuUsage > threshold) {
DoWork();
}
else {
threadId = YourThreadManager.Queue(DoWork);
}
答案 4 :(得分:0)
你的问题是优先次序。您说您有两种类型的任务:重要任务(必须运行)和休闲任务(只有在有空闲CPU并且没有重要任务排队时才能运行)。
简单的解决方案是为重要任务分配非常高优先级,为休闲任务分配非常低优先级。这样,您几乎可以保证系统的大部分CPU资源都用于运行重要任务。但是,在运行所有重要任务之后,它 确保您的休闲任务始终运行。系统可能仍会在一段时间内安排一些休闲任务。
但是,任务并行库不允许调度具有不同优先级的任务。您可以使用something like this或使用BlockingCollection的自定义实现覆盖TPL的调度程序,该实现始终首先使重要任务出列。
一种解决方案是使用TPL安排重要任务,但在您自己的后台线程上手动安排休闲任务(设置为最低线程优先级) - 此线程按顺序运行休闲任务。