返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#并行库Parallel类介绍
  • 156
分享到

C#并行库Parallel类介绍

2024-04-02 19:04:59 156人浏览 安东尼
摘要

Parallel.Invoke 这个函数的功能和Task有些相似,就是并发执行一系列任务,然后等待所有完成。和Task比起来,省略了Task.WaitAll这一步,自然也缺少了Tas

Parallel.Invoke

这个函数的功能和Task有些相似,就是并发执行一系列任务,然后等待所有完成。和Task比起来,省略了Task.WaitAll这一步,自然也缺少了Task的相关管理功能。它有两种形式:

Parallel.Invoke( params Action[] actions);
Parallel.Invoke(Action[] actions,TaskManager manager,TaskCreationOptions options);

第二种方式可以自定义一个TaskManager对任务的执行线程进行管理(第一种方式用的是默认的TaskManager.Default)。

示例如下:

static void Main(string[] args)
{
    var actions = new Action[]{
        () => ActionTest("test 1"),
        () => ActionTest("test 2"),
        () => ActionTest("test 3"),
        () => ActionTest("test 4")};

    Console.WriteLine("Parallel.Invoke 1 Test");
    Parallel.Invoke(actions);

    Console.WriteLine();

    Console.WriteLine("Parallel.Invoke 2 Test");
    Parallel.Invoke(actions, new TaskManager(new TaskManagerPolicy(1, 1, 2)), TaskCreationOptions.None);
}

static void ActionTest(object value)
{
    Console.WriteLine(">>> thread:{0}, value:{1}",
    Thread.CurrentThread.ManagedThreadId, value);
}

输出结果如下:

Parallel.Invoke 1 Test
>>> thread:3, value:test 1
>>> thread:3, value:test 2
>>> thread:4, value:test 3
>>> thread:5, value:test 4

Parallel.Invoke 2 Test
>>> thread:7, value:test 1
>>> thread:7, value:test 2
>>> thread:8, value:test 3
>>> thread:7, value:test 4

可见,由于第二次指定了最多只能使用两个线程来执行,故只有两个Task并发执行。

Parallel.ForEach和Parallel.For

Parallel.ForEach和Parallel.For用得要更加广泛一些,他可以根据一个数据源来生成一些任务(Parallel.Invoke需要事先生成这些任务),同时并发执行这些任务。基本示例如下:

static void Main(string[] args)
{
    var data = new object[] { "test 1", "test 2", "test 3" };

    Console.WriteLine("Parallel.ForEach Test");
    Parallel.ForEach(data, item => ActionTest(item));

    Console.WriteLine();

    Console.WriteLine("Parallel.For Test");
    Parallel.For(0, data.Length, index => ActionTest(data[index]));
}

这两个函数都有多种重载形式,提供了许多控制功能,由于用得不是很多,这里就不一一介绍了。但有一点不是很好:如果需要用TaskManager的话,不得不用那最复杂的那一种形式。希望最终版本的时候会提供更合理的重载形式,毕竟TaskManager还是很常用的(虽然目前的TaskManager功能薄弱了点),而那些复杂的参数不是很常用的。因此,这里提供了两个常用的扩展方法的封装:

public static class ParallelExtend
{
    public static void ParallelForEach<T>(this IEnumerable<T> source, Action<T> hanlder)
    {
        Parallel.ForEach(source, hanlder);
    }

    public static void ParallelForEach<T>(this IEnumerable<T> source, Action<T> hanlder, TaskManagerPolicy policy)
    {
        using (var manager = new TaskManager(policy))
        {
            Parallel.ForEach(source,
                () => 0,
                (item, index, state) => hanlder(item),
                local => { },
                manager,
                TaskCreationOptions.None);
        }
    }
}

通过扩展方法的方式用起来还是比较方便的。

到此这篇关于C#并行库Parallel类的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#并行库Parallel类介绍

本文链接: https://lsjlt.com/news/151698.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#并行库Parallel类介绍
    Parallel.Invoke 这个函数的功能和Task有些相似,就是并发执行一系列任务,然后等待所有完成。和Task比起来,省略了Task.WaitAll这一步,自然也缺少了Tas...
    99+
    2024-04-02
  • C#并行库Task类介绍
    Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务。对于将一个任务放进线程池 ThreadPool.QueueUserWorkItem(A); 这段代码用Ta...
    99+
    2024-04-02
  • C#并行库Parallel类怎么使用
    本篇内容主要讲解“C#并行库Parallel类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#并行库Parallel类怎么使用”吧!Parallel.Invoke这个函数的功能和Tas...
    99+
    2023-07-02
  • C#中Parallel类For、ForEach和Invoke使用介绍
    一、简介: Parallel类提供了数据和任务的并行性;Paraller.For()方法类似于C#的for循环语句,也是多次执行一个任务。使用Paraller.For()方法,可以并...
    99+
    2024-04-02
  • C#并行编程Task类用法介绍
    Task和ThreadPool的功能类似,可以用来创建一些轻量级的并行任务。对于将一个任务放进线程池 ThreadPool.QueueUserWorkItem(A); 这段代码用Ta...
    99+
    2024-04-02
  • C#中的HttpWebRequest类介绍
    提供 WebRequest 类的 HTTP 特定的实现。 继承层次结构 System.Object → System.MarshalByRefObject → &...
    99+
    2024-04-02
  • C++类的大小介绍
    1、C++结构体和类的关系 为什么讲C++类的大小要提到结构体呢,因为可能很多和我一样的学子,接触过C语言的结构体对齐,但不明白类的大小怎么计算,这其中都要用到内存对齐的概念,对于内...
    99+
    2024-04-02
  • C++的类与C#的类详细介绍
    本篇内容介绍了“C++的类与C#的类详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!许多编程人员学习C++总结经验为,有的觉得C++语...
    99+
    2023-06-17
  • C++BoostFlyweight库使用介绍
    目录一、说明二、库Boost.Flyweight炼习一、说明 以下库用于设计模式。 Boost.Flyweight 有助于在程序中使用许多相同的对象并且需要减少内存消耗的情况。Boo...
    99+
    2022-12-08
    C++ Boost Flyweight C++ Flyweight库
  • C#文件路径Path类介绍
    Path类 以帮助在程序中管理文件和目录路径。 Path类位于System.IO命名空间,是一个静态类,可以用来操作路径的每一个字段,如驱动器盘符、目录名、文件名、文件扩展名和分隔符...
    99+
    2024-04-02
  • C++抽象数据类型介绍
    公众号:Coder梁(ID:Coder_LT) 我们在学数据结构的时候,经常遇到的一个概念就是抽象数据类型(Abstract Data Type),简称ADT。 维基百科中的定义是:...
    99+
    2024-04-02
  • C#抽象类的用法介绍
    假设有2个类,一个类是主力球员,一个类是替补球员。 public class NormalPlayer { public int ID { get; ...
    99+
    2024-04-02
  • Visual Studio 中怎么利用Parallel类实现并行计算
    Visual Studio 中怎么利用Parallel类实现并行计算,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Parallel类Parallel类就是TPL...
    99+
    2023-06-17
  • MongoDB数据库介绍并用.NET Core对其进行编码
    浅入 MongoDB MonogoDB 是什么 MongoDB 是 NoSQL 型数据库,主要特征是存储结构化数据,MongoDB 是基于分布式文件存储的开源数据库系统。 结构化数据...
    99+
    2024-04-02
  • c#互斥锁Mutex类用法介绍
    什么是Mutex “mutex”是术语“互相排斥(mutually exclusive)”的简写形式,也就是互斥量。互斥量跟...
    99+
    2024-04-02
  • C#泛型类型参数的介绍
    这篇文章主要讲解了“C#泛型类型参数的介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型类型参数的介绍”吧!C# 泛型类型参数在泛型类型或方法定义中,类型参数是客户端在实例化泛型类型...
    99+
    2023-06-17
  • C++编程语言中stringstream类介绍
    stringstream是C++标准库中的一个类,用于处理字符串的输入输出。它是基于内存缓冲区的输入输出流,可以将字符串转换为各种类...
    99+
    2023-09-09
    C++
  • C#中的枚举类型(Enum)介绍
    枚举(Enum)定义 enum关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方...
    99+
    2024-04-02
  • TP DP PP 并行训练方法介绍
    这里写目录标题 张量并行TP流水线并行 PPnaive模型并行GPipePipeDream 数据并行DPFSDP 张量并行TP 挖坑 流水线并行 PP 经典的流水线并行范式有Google推出的Gpipe,和微软推出...
    99+
    2023-08-23
    python 语言模型 算法
  • 如何进行C++运行机制的介绍
    这期内容当中小编将会给大家带来有关如何进行C++运行机制的介绍,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C++编程语言是一款应用广泛,功能强大的编程应用语言。它支持多重编程范式的通用程序设计语言,并且...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作