zoukankan      html  css  js  c++  java
  • 改善C#程序的建议10:使用Parallel简化Task的使用

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

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

    staticvoid Main(string[] args)
    {
    int[] nums =newint[] { 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方法,主要用于处理泛型集合元素的并行操作,如下:

    staticvoid 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[]参数,如下:

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

    输出为:

    任务2……
    任务3……
    任务1……

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

  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2626449.html
Copyright © 2011-2022 走看看