zoukankan      html  css  js  c++  java
  • 编写高质量代码改善C#程序的157个建议——建议81:使用Parallel简化同步状态下Task的使用

    建议81:使用Parallel简化同步状态下Task的使用

    在命名空间System.Threading.Tasks中,有一个静态类Parallel简化了在同步状态下的Task的操作。Parallel主要提供3个有用的方法:For、ForEach、Invoke。

    For方法主要用于处理针对数组元素的并行操作,如下所示:

    static void Main(string[] args)  
    {  
        int[] nums = new int[] { 1, 2, 3, 4 };  
        Parallel.For(0, nums.Length, (i) =>
        {  
            Console.WriteLine("针对数组索引{0}对应的那个元素{1}的一些工作代码……",i,  
                nums[i]);  
        });  
        Console.ReadKey();  
    } 

    输出为:
    针对数组索引0对应的那个元素1的一些工作代码……  
    针对数组索引2对应的那个元素3的一些工作代码……  
    针对数组索引1对应的那个元素2的一些工作代码……  
    针对数组索引3对应的那个元素4的一些工作代码……


    可以看到,工作代码并未按照数组的索引次序进行遍历。这是因为我们的遍历是并行的,不是顺序的。所以,这里也可以引出一个小建议:如果我们的输出必须是同步的或者说必须是顺序输出的,则不应使用Parallel的方式。

    ForEach方法主要用于处理泛型集合元素的并行操作,如下所示:

    static void Main(string[] args)  
    {  
        List<int> nums = new List<int> { 1, 2, 3, 4 };  
        Parallel.ForEach(nums, (item) =>
            {  
                Console.WriteLine("针对集合元素{0}的一些工作代码……", item);  
            });  
        Console.ReadKey();  
    } 

    输出为:
    针对集合元素1的一些工作代码……  
    针对集合元素4的一些工作代码……  
    针对集合元素3的一些工作代码……  
    针对集合元素2的一些工作代码……


    使用For和ForEach方法,Parallel类型会自动为我们分配Task来完成针对元素的一些工作。当然我们也可以直接使用Task,但是上面的这种形式在语法上更为简洁。

    Parallel的Invoke方法为我们简化了启动一组并行操作,它隐式启动的就是Task。该方法接受Params Action[ ]参数,如下所示:

    static void Main(string[] args)  
    {  
        Parallel.Invoke(() =>
            {  
                Console.WriteLine("任务1……");  
            },  
            () =>
            {  
                Console.WriteLine("任务2……");  
            },  
            () =>
            {  
                Console.WriteLine("任务3……");  
            });  
        Console.ReadKey();  
    } 

    输出为:
    任务2……  
    任务3……  
    任务1……


    同样,由于所有的任务都是并行的,所以它不保证先后次序。

    转自:《编写高质量代码改善C#程序的157个建议》陆敏技

  • 相关阅读:
    拉钩爬取部分重写
    树莓派yolov3 测试训练结果时出现段错误或总线错误解决方法
    服务注册与发现【Eureka】- Eureka自我保护
    服务注册与发现【Eureka】- 服务发现Discovery
    服务注册与发现【Eureka】- 集群Eureka构建步骤
    服务注册与发现【Eureka】- 单机Eureka构建步骤
    服务注册与发现【Eureka】- Eureka简介
    SpringCloud正式开发前 -- 基础项目框架搭建
    服务注册与发现【Zookeeper】
    【校招】【内推】【阿里云】 ECS、神龙计算平台招聘|【经验分享】
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4742805.html
Copyright © 2011-2022 走看看