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……

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

  • 相关阅读:
    包含停用词的词频统计(map,set非class版本)<< 0919
    pair,map,set<<0924
    答题程序中用户登录状态的保存<<0924
    时间戳<<0923
    list,vector相关函数与区别<<0922
    类里面的赋值和拷贝函数<<0922
    vector的初始化补充,list,find函数,指针和迭代器等<<0922
    redhat 6上nis配置
    如何查看cache信息
    oprofile 安装使用
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2626449.html
Copyright © 2011-2022 走看看