关于Parallel.For/Foreach并行方法中的localInit, body, localFinally使用
2014-03-08 23:36
513 查看
对集合成员的操作往往可以通过并行来提高效率,.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/task的thread-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.
其中,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/task的thread-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.
相关文章推荐
- init()方法必须使用super.init(config)的原因
- 并行计算—使用reduction方法求和
- angular localStorage使用方法
- Java中使用LocalDate根据日期来计算年龄的实现方法
- [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)-win32线程和pthread线程比较]
- 对象使用Init方法重新初始化和描述性编程识别对象
- Swift基础之init方法,实例(对象)方法,类(静态)方法的使用(多标签Demo)
- 关于C++ 里使用Openmp并行之cout混乱输出的解决方法
- initWithFrame和initWithCoder使用技巧,以及他们什么时候被调用,自定义控件必须具备三个方法initWithFrame和initWithCoder以及drawRect
- “应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具” 的解决方法
- tornado使用put方法的body内容限制
- SSM框架——SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法
- ASP.NET MVC3 局部页面@RENDERBODY @RENDERPAGE@RENDERSECTION使用方法详细说明
- spring中使用@RequestBody,对应的bean中属性名大写注入为空的解决方法
- 使用spring的LocalVariableTableParameterNameDiscoverer获取类方法参数名称列表
- Angular Local Storage 使用方法
- Python中使用多进程来实现并行处理的方法小结
- Page_Load Page_Init方法使用原理(转)
- nodejs 使用app.use(express.bodyParser()); 出行异常----解决方法