C#如何:编写简单的 Parallel.ForEach 循环

C#如何:编写简单的 Parallel.ForEach 循环如何:编写简单的Parallel.ForEach循环本文档使用lambda表达式在PLINQ中定义委托。如果不熟悉C#或VisualBasic中的lambda表达式,请参阅PLINQ和TPL中的Lambda表达式。示例此示例假定C:\Users\Public\Pictures\SamplePictures文件夹中有几个.jpg文件,并创建名为“Modified”的新子文件夹。运行该示例时,它会旋转示例图片中的每个.jpg图像并将其保存到.

大家好,又见面了,我是你们的朋友全栈君。

如何:编写简单的 Parallel.ForEach 循环

本文档使用 lambda 表达式在 PLINQ 中定义委托。 如果不熟悉 C# 或 Visual Basic 中的 lambda 表达式,请参阅 PLINQ 和 TPL 中的 Lambda 表达式

示例

此示例假定 C:\Users\Public\Pictures\Sample Pictures 文件夹中有几个 .jpg 文件,并创建名为“Modified”的新子文件夹。 运行该示例时,它会旋转示例图片中的每个 .jpg 图像并将其保存到“Modified”文件夹 可以根据需要修改这两个路径。

C#复制

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;

namespace ParallelExample
{
    class Program
    {
        static void Main()
        {
            // 2 million
            var limit = 2_000_000;
            var numbers = Enumerable.Range(0, limit).ToList();

            var watch = Stopwatch.StartNew();
            var primeNumbersFromForeach = GetPrimeList(numbers);
            watch.Stop();

            var watchForParallel = Stopwatch.StartNew();
            var primeNumbersFromParallelForeach = GetPrimeListWithParallel(numbers);
            watchForParallel.Stop();

            Console.WriteLine($"Classical foreach loop | Total prime numbers : {primeNumbersFromForeach.Count} | Time Taken : {watch.ElapsedMilliseconds} ms.");
            Console.WriteLine($"Parallel.ForEach loop  | Total prime numbers : {primeNumbersFromParallelForeach.Count} | Time Taken : {watchForParallel.ElapsedMilliseconds} ms.");

            Console.WriteLine("Press any key to exit.");
            Console.ReadLine();
        }

        /// <summary>
        /// GetPrimeList returns Prime numbers by using sequential ForEach
        /// </summary>
        /// <param name="inputs"></param>
        /// <returns></returns>
        private static IList<int> GetPrimeList(IList<int> numbers) => numbers.Where(IsPrime).ToList();

        /// <summary>
        /// GetPrimeListWithParallel returns Prime numbers by using Parallel.ForEach
        /// </summary>
        /// <param name="numbers"></param>
        /// <returns></returns>
        private static IList<int> GetPrimeListWithParallel(IList<int> numbers)
        {
            var primeNumbers = new ConcurrentBag<int>();

            Parallel.ForEach(numbers, number =>
            {
                if (IsPrime(number))
                {
                    primeNumbers.Add(number);
                }
            });

            return primeNumbers.ToList();
        }

        /// <summary>
        /// IsPrime returns true if number is Prime, else false.(https://en.wikipedia.org/wiki/Prime_number)
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        private static bool IsPrime(int number)
        {
            if (number < 2)
            {
                return false;
            }

            for (var divisor = 2; divisor <= Math.Sqrt(number); divisor++)
            {
                if (number % divisor == 0)
                {
                    return false;
                }
            }
            return true;
        }
    }
}

Parallel.ForEach 循环的工作原理类似 Parallel.For 循环。 该循环对源集合进行分区,并根据系统环境在多个线程上安排工作。 系统上的处理器越多,并行方法的运行速度就越快。 对于一些源集合,有序循环可能会更快,具体视源大小以及该循环要执行的工作类型而定。 有关性能的详细信息,请参阅数据和任务并行的潜在问题

若要详细了解并行循环,请参阅如何:编写简单的 Parallel.For 循环

若要将 Parallel.ForEach 与非泛型集合结合使用,可以使用 Enumerable.Cast 扩展方法,将集合转换为泛型集合,如下面的示例所示:

C#复制

Parallel.ForEach(nonGenericCollection.Cast<object>(),
    currentElement =>
    {
    });

还可以使用并行 LINQ (PLINQ) 并行处理 并行 LINQ (PLINQ)

编译并运行代码

可以作为 .NET Framework 的控制台应用程序或 .NET Core 的控制台应用程序编译代码。

Visual Studio 中有适用于 Windows 桌面和 .NET Core 的 Visual Basic 和 C# 控制台应用程序模板。

从命令行,可使用 .NET Core CLI 命令(例如 dotnet new console 或 dotnet new console -lang vb),或者可创建文件并使用 .NET Framework 应用程序提供的命令行编译器。

对于.NET Core 项目,必须引用 System.Drawing.Common NuGet 包。 在 Visual Studio 中,使用 NuGet 包管理器安装该包。 或者,也可以在 *.csproj 或 *.vbproj 文件中添加对包的引用:

XML复制

<ItemGroup>
     <PackageReference Include="System.Drawing.Common" Version="4.5.1" />
</ItemGroup>

要从命令行运行 .NET Core 控制台应用程序,请使用包含该应用程序的文件夹中的 dotnet run

要从 Visual Studio 中运行控制台应用程序,请按 F5。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161801.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华为9月3日或推出麒麟9000;TiDB 3.0.18 发布| 极客头条

    华为9月3日或推出麒麟9000;TiDB 3.0.18 发布| 极客头条「极客头条」——技术人员的新闻圈!CSDN的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。国内要闻华为9月3日举行IFA活动:推出麒麟9000,Mate40发布时间或确认华为宣布将于德国当地时间9月3日下午14点(北京时间20点)举办IFA2020主题演讲,预计将会推出5nm麒麟90005G处理器,并且公布Mate40系列发布时间。从目前已有的消息来看,麒麟9000处理器基于台积电5nm工艺打造,并集成华为研发的新NPU、5G基带等技术。(新浪科

    2022年6月2日
    45
  • pytest fixtures_pytest allure

    pytest fixtures_pytest allurefixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月29日
    8
  • vue富文本编辑器插件推荐_vue富文本编辑器的使用

    vue富文本编辑器插件推荐_vue富文本编辑器的使用vue富文本编辑器,插件

    2022年10月14日
    4
  • JAVA 分布式 – 分布式介绍[通俗易懂]

    JAVA 分布式 – 分布式介绍[通俗易懂]什么是分布式系统?要理解分布式系统,主要需要明白一下2个方面:1.分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。2.这些连通的节点上部署了我们的节点,并且相互的操作会有协同。分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已,而实际上这些服务是通过背后的众多服务器组成的一个分布式系统,因此分布式系统看…

    2022年4月26日
    52
  • 微机原理与接口技术课件_微型计算机原理与接口技术课后答案

    微机原理与接口技术课件_微型计算机原理与接口技术课后答案原标题:微机原理与接口技术课程教与学(教学大纲)《微机原理与接口技术》教学大纲文/牟琦英文名称:MicrocomputerPrincipleandInterfaceTechnology适用专业:计算机类专业、自动化类专业、电子信息类专业教材:牟琦.微机原理与接口技术(第3版).[M].北京:清华大学出版社,2018一、课程的性质“微机原理与接口技术”是计算机类、电子信息类、自动化类等相关专业…

    2022年10月2日
    3
  • 【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性[通俗易懂]

    【一个小功能】从js判断ie版本,浅谈navigator对象的appName属性[通俗易懂]判断IE版本主要的是获取两个属性,a.当前浏览器名称,b.当前浏览器版本,为此不得不了解navigator对象。先贴代码作为一个初次了解navigator对象的人,对于appName属性(浏览器名

    2022年7月3日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号