zoukankan      html  css  js  c++  java
  • 关于Parallel.For/Foreach并行方法中的localInit, body, localFinally使用

    对集合成员的操作往往可以通过并行来提高效率,.NET Parallel类提供了简单的方法来帮助我们实现这种并行,比如Paralle.For/ForEach/Invoke方法。

    其中,For/ForEach方法提供了重载,允许我们提供3个delegate,来实现对thread行为的控制。

    函数声明如下:

    public static ParallelLoopResult ForEach<TSource, TLocal>(IEnumerable<TSource> source,

    Func<TLocal> localInit,

    Func<TSource, ParallelLoopState, long, TLocal, TLocal> body,

    Action<TLocal> localFinally);

    public static ParallelLoopResult ForEach<TSource, TLocal>(IEnumerable<TSource> source,

    Func<TLocal> localInit,

    Func<TSource, ParallelLoopState, TLocal, TLocal> body,

    Action<TLocal> localFinally);

    上面2个声明的差别在于一个long型输入参数,这个参数是元素在集合中的index,由CLR传递给body函数。

    需要注意的是,localInit只是在每个task/thread开始参与到对集合元素的处理时执行一次,而不是针对每个集合元素都执行一次,类似的,localFinally只有在task/thread完成所有分配给它的任务之后,才被执行一次。

    CLR会为每个Thread/Task维护一个thread-local storage,可以理解为thread/task在整个执行过程中的状态。

    当一个thread/task参与到执行中时,localInit中返回的TLocal类型值会被作为这个状态的初始值,随着body的执行,这个状态值会被改变,而body的返回类型也是TLocal,意味着每一次body执行结束,会把最新的TLocal值返回给CLR,而CLR会把这个值设置到thread/taskthread-local storage上去,从而实现thread/task状态的更新。

    最后,localFinally可以返回这个状态值,作为thread/task完成它所负责的所有处理任务后的最终结果。

    参考:(http://msdn.microsoft.com/en-us/library/dd783359%28v=vs.110%29.aspx

    CLR via C# 4th Edition Ch.27 Parallel's Static For, ForEach, and InvokeMethods.

  • 相关阅读:
    ADO.NET 2.调用存储过程
    Resharper上手指南
    获取HTML源码(只取文字,判断编码,过滤标签)
    .net(c#) winform文本框只能输入数字,不能其他非法字符(转)
    ADO.NET – 3.书籍管理系统详解
    GemBox.ExcelLite.dll导出到Excel
    C#4.0图解教程 第7章 类和继承
    C#读取网站HTML内容
    C#回顾 – 1.IO文件操作
    Javascript s10 (Jquery相关手册整合及功能实现)
  • 原文地址:https://www.cnblogs.com/smwikipedia/p/3588822.html
Copyright © 2011-2022 走看看