Parallel.Invoke

并行执行多个方法,只有在所有方法都执行后才会返回

static void Main(string[] args)
{
    Parallel.Invoke(
    () => ConvertEllipses(),
    () => ConvertRectangles(),
    () => ConvertLines(),
    () => ConvertText());
    System.Console.ReadLine();
}
 
static void ConvertEllipses()
{
    System.Console.WriteLine("Ellipses converted.");
}
 
 
static void ConvertRectangles()
{
    System.Console.WriteLine("Rectangles converted.");
}
 
static void ConvertLines()
{
    System.Console.WriteLine("Lines converted.");
}
 
static void ConvertText()
{
    System.Console.WriteLine("Text converted.");
}
 
先给两段基本代码,方便后面理解。
将Byte[]转成16进制表示的字符串
; i < byteArray.Length; i++)
    {
        sb.Append(byteArray[i].ToString("X2"));
    }
    return sb.ToString();
}
生成一些AES的Key,并计时
AesManaged在System.Security.Cryptography
Stopwatch和Debug在System.Diagnostics
 
;
; i <= NUM_AES_KEYS; i++)
    {
        aesM.GenerateKey();
        byte[] result = aesM.Key;
        string hexString = ConvertToHexString(result);
        // Console.WriteLine("AES KEY: {0} ", hexString);
    }
    Debug.WriteLine("AES: " + sw.Elapsed.ToString());
}
 

Parallel.For

不支持浮点数和进步。无法保证迭代执行的顺序
, NUM_AES_KEYS , (int i) =>
    {
        var aesM = new AesManaged();
        byte[] result = aesM.Key;
        string hexString = ConvertToHexString(result);
        // Console.WriteLine(“AES KEY: {0} “, hexString);
    });
    Debug.WriteLine("AES: " + sw.Elapsed.ToString());
}

Parallel.ForEach

利用一个范围整数作为一组数据,通过一个分区器,把数据分成一组数据块。每一块的数据都通过循环的方式处理,而这些循环都是并行的。
, NUM_AES_KEYS ), range =>
    {
        var aesM = new AesManaged();
        Debug.WriteLine(
            "AES Range ({0}, {1}. TimeOfDay before inner loop starts: {2})",
            range.Item1, range.Item2,
            DateTime.Now.TimeOfDay);
        for (int i = range.Item1; i < range.Item2; i++)
        {
            aesM.GenerateKey();
            byte[] result = aesM.Key;
            string hexString = ConvertToHexString(result);
            // Console.WriteLine(“AES KEY: {0} “, hexString);
        }
    });
    Debug.WriteLine("AES: " + sw.Elapsed.ToString());
}

根据内核数目优化分区

Parallel.ForEach(
    Partitioner.Create(,NUM_AES_KEYS,(()),
    range =>
    {
        //...
    });

使用IEnumerable数据源

;
, NUM_MD5_HASHES);
}
 
private static void ParallelForEachGenerateMD5Hashes()
{
    var sw = Stopwatch.StartNew();
    var inputData = GenerateMD5InputData();
    Parallel.ForEach(inputData, (int number) =>
    {
        var md5M = MD5.Create();
        byte[] data =
            Encoding.Unicode.GetBytes(
                Environment.UserName + number.ToString());
        byte[] result = md5M.ComputeHash(data);
        string hexString = ConvertToHexString(result);
        // Console.WriteLine("MD5 HASH: {0}", hexString);
    });
    Debug.WriteLine("MD5: " + sw.Elapsed.ToString());
}

从并行循环中退出

在参数中使用ParallelLoopState,就可以使用loopState.Break();或者loopState.Stop();进行退出。其中的差别在于,假设调用Break的时候正在处理迭代100,那么可以保证小于100的迭代都被执行,而Stop不保证这个。
ParallelLoopResult作为返回值,可以知道是否是正常完成或者被Break的
ParallelLoopResult loopResult = Parallel.ForEach(inputData,
(int number, ParallelLoopState loopState) =>
{
    //...
    loopState.Break();
    return;
    //...
});

捕获并行循环的异常

try
{
    loopResult = Parallel.ForEach(inputData,
    (int number, ParallelLoopState loopState) =>
    {
        //...
        throw new Exception();
        //..
    });
}
catch (AggregateException ex)
{
    foreach (Exception innerEx in ex.InnerExceptions)
    {
        Debug.WriteLine(innerEx.ToString());
    }
}

ParaleelOption

用于修改并行度。
, NUM_AES_KEYS , parallelOptions, (int i) =>
    {
        var aesM = new AesManaged();
        byte[] result = aesM.Key;
        string hexString = ConvertToHexString(result);
        // Console.WriteLine(“AES KEY: {0} “, hexString);
    });
    Debug.WriteLine("AES: " + sw.Elapsed.ToString());
}
 
 

《C#并行编程高级教程》第2章 命令式编程 笔记的更多相关文章

  1. 【读书笔记】.Net并行编程高级教程(二)-- 任务并行

    前面一篇提到例子都是数据并行,但这并不是并行化的唯一形式,在.Net4之前,必须要创建多个线程或者线程池来利用多核技术.现在只需要使用新的Task实例就可以通过更简单的代码解决命令式任务并行问题. 1 ...

  2. 【读书笔记】.Net并行编程高级教程--Parallel

    一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控>这本书中也多次提到并发,不管是计算机 ...

  3. Net并行编程高级教程--Parallel

    Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控 ...

  4. Objective-C 基础教程第三章,面向对象编程基础知

    目录 Objective-C 基础教程第三章,面向对象编程基础知 0x00 前言 0x01 间接(indirection) 0x02 面向对象编程中使用间接 面向过程编程 面向对象编程 0x03 OC ...

  5. 《C#并行编程高级教程》第9章 异步编程模型 笔记

    这个章节我个人感觉意义不大,使用现有的APM(异步编程模型)和EAP(基于时间的异步模型)就很够用了,针对WPF和WinForm其实还有一些专门用于UI更新的类. 但是出于完整性,还是将一下怎么使用. ...

  6. 《C#并行编程高级教程》第5章 协调数据结构 笔记

    本章介绍了一些轻量级的同步原语,其中有很大部分是.NET Framework 4才引入的. System.Threading.Barrier 用于一段程序分成多个阶段,每个阶段的开始都需要之前的阶段完 ...

  7. 《C#并行编程高级教程》第6章 PLINQ:声明式数据并行 笔记

    PLINQ这个话题好多书都写到过,这本也没有什么特别好的地方. 几个有用和有趣的点记录一下.   顺序的不确定性 用PLINQ就一定要记住并行后会导致顺序不确定的问题.解决方案就是AsOrdered或 ...

  8. 《C#并行编程高级教程》第4章 并发集合 笔记

    这一章主要介绍了System.Collections.Concurrent下的几个类. ConcurrentQueue<T> 并发队列.完全无锁,使用CAS(compare-and-swa ...

  9. 《C#并行编程高级教程》第8章 线程池 笔记

    主要的几个概念(详细最好还是看书,配合插图看)   任务是会被分配到线程上的,而这些线程都在线程池引擎下管理 线程池引擎管理着合适数量的线程池,线程从全局队列获取工作项执行. .NET4 Framew ...

随机推荐

  1. CAF(C++ actor framework)使用随笔(send sync_send)(二)

    a). 发完就忘, 就像上面anon_send 以及send #include <iostream> #include "caf/all.hpp" #include & ...

  2. Wix: Using Patch Creation Properties - Small Update

    Source Reference: wix help document  -- WiX Toolset License Using Patch Creation Properties  A patch ...

  3. STL 常见容器

    vector: 是一种在结尾处高效插入.删除的容器,本质上是一个动态数组,可以自动维护数组的空间分配.它也允许在开头和中间插入.删除数据,但是效率极低. <span style="fo ...

  4. 判断浏览器是否支持某个css属性

    方法:直接判断浏览器是否支持某个CSS属性才是王道,document.documentElement.style 如:判断是否支持 transform if( 'MozTransform' in do ...

  5. 用EPPlus导入导出数据到excel

    项目上中要用到将数据库中所有表导出为Excel,以及将Excel数据导入数据库中的操作,使用EPPlus组件,编写以下两个函数. using OfficeOpenXml;using OfficeOpe ...

  6. DataNavigator之分页

    前言 做客户端也有两个月了,先前做列表都没有分页,可能考虑数据也不是很多,昨天做了一个页面,考虑到了数据的问题,所以改为分页查询.因为也是第一次用dev,用哪个控件分页呢,还是要去搜一下,得出的事Da ...

  7. 发光的input框(纯css实现)

    css代码: input{width: 200px;height: 40px;} input.focus{border-color: #08c;box-shadow: 0 0 4px #8bd6fb; ...

  8. 一些SVN 地址

    lockbox3 地址: https://svn.code.sf.net/p/tplockbox/code/trunc indy10 地址:https://svn.atozed.com:444/svn ...

  9. ibatis访问oracle数据库US7ASCII中文乱码问题

    今天碰到一个问题,使用ibatis框架访问编码为US7ASCII的oracle数据中文乱码, 找了很久终于有了解决方案 首先 SqlMap-Config.xml按如下配置 <sqlMapConf ...

  10. hdu 4746 Mophues 莫比乌斯反演+前缀和优化

    Mophues 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<=n, 1<=b<=m) 有Q组数据:(n, m, ...