gpt4 book ai didi

c# - 将并行 for 循环作为低优先级 CPU 操作执行的最简单方法是什么?

转载 作者:行者123 更新时间:2023-11-30 17:01:46 27 4
gpt4 key购买 nike

背景
从历史上看,我不必编写太多与线程相关的代码。我熟悉这个过程,我可以在需要时使用 System.Threading 来做我需要做的事情。然而,我的大部分经验都停留在 .Net 2.0 世界(呃!),我需要一些帮助来在最新版本的 .Net 中执行一个非常简单的任务。

我需要编写一个简单的并行作业,但我更希望它作为低优先级任务执行,不会使我的 PC 缓慢停止。

下面是一个简单的并行示例,演示了我要完成的工作类型。在此示例中,我取了一个随机数,如果新值大于已发现的最后一个最大随机数,则将其存储。

请理解,这个例子的重点是严格地表明我有一个我希望重复执行、比较和存储的计算。我理解变量锁定的必要性,我也知道这段代码并不完美。然而,这是一个非常简单的例子,说明了我需要完成的事情的性质。如果您运行这段代码,您的 CPU 将会停止运行。

int i = 0;
ThreadSafeRNG r = new ThreadSafeRNG();
ParallelOptions.MaxDegreeOfParallelism = 4; //Assume I have 8 cores.
Parallel.For(0, Int32.MaxValue, (j, loopState) =>
{
int k = r.Next();
if (k > i) k = i;
}

我怎样才能并行地完成这项工作,并将其作为低优先级 CPU 作业执行。与标准的 for 循环相比,上述机制提供了巨大的性能改进。然而,代价是我无法使用我的计算机,即使在设置了 MaxDegreeOfParallelism 选项之后也是如此。

我能做什么?

最佳答案

因为 Parallel.For 使用 ThreadPool 线程,所以不能将线程的优先级设置得低。但是您可以更改整个应用程序的优先级

Process currentProcess = Process.GetCurrentProcess();
ProcessPriorityClass oldPriority = currentProcess.PriorityClass;

try
{
currentProcess.PriorityClass = ProcessPriorityClass.BelowNormal;

int i = 0;
ThreadSafeRNG r = new ThreadSafeRNG();
ParallelOptions.MaxDegreeOfParallelism = 4; //Assume I have 8 cores.
Parallel.For(0, Int32.MaxValue, (j, loopState) =>
{
int k = r.Next();
if (k > i) k = i;
}
}
finally
{
//Bring the priority back up to the original level.
currentProcess.PriorityClass = oldPriority;
}

如果您真的不希望降低整个应用程序的优先级,请将此技巧与某种形式的 IPC(如 WCF)结合使用,并让您的缓慢长时间运行的操作在您启动并根据需要终止的第二个进程中运行。

关于c# - 将并行 for 循环作为低优先级 CPU 操作执行的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20640538/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com