C# 确保并行调用不会占用太多CPU
我有一个带有WCF的C程序,它使用了一点并行调用 首先,每个客户端调用在服务端都与我的WCF服务并行 我有一个包含B类列表的a类 我可以添加B类的列表而不添加a 为了插入元素B的列表,我并行地做,因为在添加之前,我做了很多验证。还有一个 一些客户端一次性添加了一个非常大的元素列表 因此,我使用并行调用来添加每个a元素 我使用并行选项将其配置为使用不超过一半的CPU。 让做其他事情的其他用户使用CPU 但是,添加已经被并行限制到一半CPU的类A的任务会创建另一个并行调用来添加类B 例如,应 InvokeAddClassAList 创建两个线程AddClassA 每一个AddClassA 创建两个线程AddClassB 所以,我现在有4个线程 这4个线程是否限制为CPU的一半? 或者只有两个AddClassA被限制为一半CPU,并且每个子线程可以使用他们想要的CPUC# 确保并行调用不会占用太多CPU,c#,multithreading,wcf,parallel-processing,C#,Multithreading,Wcf,Parallel Processing,我有一个带有WCF的C程序,它使用了一点并行调用 首先,每个客户端调用在服务端都与我的WCF服务并行 我有一个包含B类列表的a类 我可以添加B类的列表而不添加a 为了插入元素B的列表,我并行地做,因为在添加之前,我做了很多验证。还有一个 一些客户端一次性添加了一个非常大的元素列表 因此,我使用并行调用来添加每个a元素 我使用并行选项将其配置为使用不超过一半的CPU。 让做其他事情的其他用户使用CPU 但是,添加已经被并行限制到一半CPU的类A的任务会创建另一个并行调用来添加类B 例如,应 Inv
var pCount = Environment.ProcessorCount / 2;
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = pCount > 0 ? pCount : 1;
Parallel.Invoke(options, actions.ToArray());
您的CPU是应该使用的资源。如果它闲置,没有人会感谢你。因此,限制您的流程是毫无意义的。你甚至不知道当时是否有其他人在使用电脑 您可以使用自己的实现来影响何时以及何时启动多少任务
但是,同样没有意义。你应该提出尽可能多的要求。如果你想善待其他用户,降低进程优先级,这样如果你想使用100%,他们仍然可以使用优先级更高的进程。你能分享你做过的任何代码示例吗?并行执行允许在CPU可用时使用CPU容量。它并不是为了强迫一个过程使用特定的分数。这只是意味着,如果有更多的可用容量,那么一个活动不必被限制为一个线程。我的目的是限制任务列表的CPU使用量。即使有些cpu是可用的,我也不希望它使用超过一半的代码样本。。。。这是一个非常重要的方法,为什么我选择描述我的线程是如何工作的,而不是给出一个你可能会想到使用的混乱的代码样本。它不会限制CPU的使用量,但可以降低并行操作的程度,因此,可能会降低CPU内核的使用率。嗯,我不确定CPU始终保持100%的使用率是否好。但主要的目标是如果有人发射了很长的东西,他知道他会等待几秒钟/分钟。我想让后面的人使用Cpu,并启动一个非常短的操作。我不想让他等到有空的时候。。。当我知道一项任务是长期的。如果我的CPU使用率达到100%,它会降低想要什么东西的用户的速度。我在同一台机器上连接了20个人。所以我想发送一点消息,如果有人发布了一个非常重要的东西,让ressource为其他人提供服务……这不是MaxDegreeOfParallelism的目的。为了减少线程数量的使用?你似乎认为如果你想要100%,你就可以得到100%。每个过程都有优先权。资源是根据这个优先级分配的。例如,如果您有一个无止境循环和一个浏览器窗口,如果无止境循环具有更高的优先级,您将无法处理该窗口。如果将窗口设置为更高的优先级,您将能够毫无问题地浏览,因为只有剩余的资源将被分配给100%hog。因此,您的目标应该是使用100%,但您应该将流程的优先级设置为较低,以便只获得剩余的100%。没有意义的是使用正常优先级,但低于100%。你应该尽可能快地前进,为速度更快的人让路,总是以你的速度前进,但不为任何人让路,这意味着你总是迟到,有时会让其他人失望。我的服务是一个应用程序,有许多流程。。。所以他一次可以得到操作系统所能提供的最大值。但在我的应用程序中,我想做一点改变,并定义这个方法,特别是永远不会被授权一次使用100%的应用程序