Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Net中的并行性能否接管CPU,并可能拒绝向其他进程提供服务?_C#_.net_C# 4.0_Parallel Processing_Task Parallel Library - Fatal编程技术网

C# Net中的并行性能否接管CPU,并可能拒绝向其他进程提供服务?

C# Net中的并行性能否接管CPU,并可能拒绝向其他进程提供服务?,c#,.net,c#-4.0,parallel-processing,task-parallel-library,C#,.net,C# 4.0,Parallel Processing,Task Parallel Library,我试图理解并行是如何在.Net中实现的。下面的代码作为示例 这段代码在客户集合上循环,并在他们上次联系后14天后向他们发送电子邮件。我这里的问题是,如果customer表非常大,发送电子邮件需要几秒钟的时间,那么该代码是否会将处于拒绝服务模式的CPU用于其他重要进程 有没有一种方法可以并行运行以下代码行,但只使用很少的内核,这样其他进程就可以共享CPU?还是我以错误的方式处理问题 Parallel.ForEach(customers, (customer, parallelLoopState)

我试图理解并行是如何在.Net中实现的。下面的代码作为示例

这段代码在客户集合上循环,并在他们上次联系后14天后向他们发送电子邮件。我这里的问题是,如果customer表非常大,发送电子邮件需要几秒钟的时间,那么该代码是否会将处于拒绝服务模式的CPU用于其他重要进程

有没有一种方法可以并行运行以下代码行,但只使用很少的内核,这样其他进程就可以共享CPU?还是我以错误的方式处理问题

Parallel.ForEach(customers, (customer, parallelLoopState) =>
{
    // database operation
    DateTime lastContact = theStore.GetLastContact(customer); 
    TimeSpan timeSinceContact = DateTime.Now - lastContact;

    // If it's been more than two weeks, send an email, and update...
    if (timeSinceContact.Days > 14)
    {
         // Exit gracefully if we fail to email, since this 
         // entire process can be repeated later without issue.
         if (theStore.EmailCustomer(customer) == false)
             parallelLoopState.Break();
         else
             customer.LastEmailContact = DateTime.Now;
    }
});
接受答案:

思维过程是正确的!正如Cole Campbell指出的,在这个特定的示例中,通过指定ParallelOption对象,可以控制和配置应该使用多少内核。这里是如何

var parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 
                 Math.Max(Environment.ProcessorCount / 2, 1);
和Parallel.ForEach将按如下方式使用

Parallel.ForEach(customers, parallelOptions, 
                                (customer, parallelLoopState) =>
{
    //do all same stuff
}
使用.WithDegreeOfParallelism(int numberOfThreads),PLINQ也可以使用相同的概念。
有关如何配置并行选项的详细信息,任务并行库的设计目的是在安排任务运行时考虑系统工作负载,因此这不应成为问题。但是,您可以在
ParallelOptions
类上使用
MaxDegreeOfParallelism
属性,该属性可以传递到
ForEach()
的一个重载中,以限制它可以执行的并发操作数,如果您确实需要。

我不确定默认调度程序是否实际使用了
MaxDegreeOfParallelism
(至少在它可能对应于最大线程数的范围内)。我相信这个调度器处理得很好:谢谢,科尔!你的回答对我有用。另外,我在另一个博客.@ta.speot.is中发现了更多的讨论-我刚刚做了一个测试,在一个并行foreach循环中处理1000万个整数,它看起来肯定是
MaxDegreeofParallelism
起了作用。未能指定它会使我的8个逻辑核中的7个达到100%。将其设置为某个值(例如2)会显著降低CPU利用率,可能是因为其中只有2个同时运行。@ColeCampbell感谢您的测试。Hans:您能引用相关文档吗?我按照MSDN上的说明:“当并行循环运行时,TPL对数据源进行分区,以便循环可以同时在多个部分上运行。在幕后,任务调度器根据系统资源和工作负载对任务进行分区。如果可能,如果工作负载变得不平衡,调度程序会在多个线程和处理器之间重新分配工作。“操作系统的任务是确保这种情况不会发生。它为所有进程中的所有线程提供了公平的内核份额。这种代码不会导致任何显著的cpu负载。@HansPassant-你确定吗?因为我在笔记本电脑上的CPU使用率达到了最高水平,在这段时间内,甚至连鼠标移动中断都不受欢迎。@ImranAmjad一个进程的高CPU使用率不会降低鼠标指针的速度。通常,当我看到这一点时,这意味着一些应用程序占用了太多内存,而机器是。@JoeWhite我在4个处理器系统上运行8个并行线程,每个线程都运行VBA Excel代码,所有线程都在进行繁重的计算。每个Excel.exe最多占用25%的CPU和60MB内存。@JoeWhite为了分享一个有趣的事实,我使用ParallelOption运行代码,在4处理器系统上一次只运行8个线程中的4个,操作系统UI事件响应良好。但当我删除ParallelOption并运行8个线程时,它同时启动了所有线程,并且由于正在发生上下文切换而降低了系统的速度,这就是为什么它会降低操作系统的速度。我不会改变线程优先级。