用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
2015-04-15 19:52
561 查看
Parallel类是.NET 4中新增的抽象线程类。如果你开发用的是VS2008或更低版本,那么就直接关闭吧,下面两个示例用了匿名委托,如果不知道匿名委托的语法,那么先去简单了解一下,不然很难理解示例代码。
Parallel.For()方法类似于C#的for循环语句,也是多次执行一个任务。使用Parallel.For()方法,可以并行运行迭代。迭代的顺序没有定义。
在For()方法中,前两个参数定义了循环的开头和结束。下面代码示例从0迭代到9。第三个参数是一个Action<int>委托。整数是循环的迭代次数,该参数被传递给Action<int>委托引用的方法。Parallel.For()方法的返回类型是ParallelLoopResult结构,它提供是否结束的信息。
在Parallel.For()的方法体中,把索引、任务标识符和纯种标识符写入控制台中。从输出可以看出,顺序是不能保证的。大家可以自行多次测试。
For()方法的泛型版本还接受3个委托参数。在下面的示例中,实现了For()的泛型方法,别看这么多,合起来就一句,分开来看比较清晰而已。
Parallel.For()方法类似于C#的for循环语句,也是多次执行一个任务。使用Parallel.For()方法,可以并行运行迭代。迭代的顺序没有定义。
在For()方法中,前两个参数定义了循环的开头和结束。下面代码示例从0迭代到9。第三个参数是一个Action<int>委托。整数是循环的迭代次数,该参数被传递给Action<int>委托引用的方法。Parallel.For()方法的返回类型是ParallelLoopResult结构,它提供是否结束的信息。
ParallelLoopResult result = Parallel.For ( 0, 10, i =>{ Console.WriteLine ( "{0}, task: {1} , thread: {2}",i,Task.CurrentId ,Thread.CurrentThread.ManagedThreadId ); Thread.Sleep ( 10 ); } ); Console.WriteLine ( result.IsCompleted);
在Parallel.For()的方法体中,把索引、任务标识符和纯种标识符写入控制台中。从输出可以看出,顺序是不能保证的。大家可以自行多次测试。
For()方法的泛型版本还接受3个委托参数。在下面的示例中,实现了For()的泛型方法,别看这么多,合起来就一句,分开来看比较清晰而已。
Parallel.For<string> ( 0, 20, ( ) => { Console.WriteLine ( "init thread {0}, task {1}", Thread.CurrentThread.ManagedThreadId, Task.CurrentId ); return string.Format ( "t: {0}", Thread.CurrentThread.ManagedThreadId ); }, (i,pls,str) => { Console.WriteLine ( "body i {0} str1 {1} thread {2} task {3}",i,str,Thread.CurrentThread.ManagedThreadId ,Task.CurrentId ); return string.Format ( "i {0}", i ); }, (str1) => { Console.WriteLine ( "finally {0}",str1 ); } );
相关文章推荐
- 用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
- 用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
- 工作总结 for 另类写法 循环加时间 集合合并 也是用的 static class Enumerable (IEnumerable<T>的扩展方法) (IEnumerable<T> 的 工具类) (所有集合 数组都实现IEnumerable<T>)
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 使用PHP实现密保卡功能实现代码<打包下载直接运行>
- 四种方法js实现点击<li>弹出索引
- The method list(String, Object[]) is ambiguous for the type BaseHibernateDao<M,PK>错误解决方法
- java.lang.ThreadLocal<T>的具体实现
- .net 4.0的Lazy<T>方法,反射实现延迟加载。
- 运行map()后,报:<map object at 0x02629E50>解决方法与原因分析
- cloudemanager安装时出现ProtocolError: <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized>问题解决方法(图文详解)
- 迭代输出Map和List<Map<String,Object>>的方法
- Myeclipse运行程序时出现Console没有输出信息(只有<terminate>...)解决方法
- Myeclipse运行程序时出现Console没有输出信息(只有<terminate>...)解决方法
- 将<select>被选中项的值通过<a>链接的参数形式传递给后台的实现方法
- 不安装.net framework框架运行.Net 程序的方法<收藏>
- 不安装.net framework框架运行.Net 程序的方法<收藏>
- 数组排序方法的性能比较(2):Array.Sort<T>实现分析
- 艾伟_转载:数组排序方法的性能比较(中):Array.Sort<T> 实现分析
- 一起谈.NET技术,数组排序方法的性能比较(中):Array.Sort<T> 实现分析