用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代

Parallel类是.NET 4中新增的抽象线程类。如果你开发用的是VS2008或更低版本,那么就直接关闭吧,下面两个示例用了匿名委托,如果不知道匿名委托的语法,那么先去简单了解一下,不然很难理解示例代码。

  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 );
                }
                );

时间: 2024-11-05 15:00:27

用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代的相关文章

C#多线程 为多核处理器而生的多线程方法Parallel.For和Parallel.ForEach

1.在.net4.0中,有了一个新的类库:任务并行库.它极大地简化了并行编程且内容丰富.这里仅介绍其中最简单的 Parallel.For循环和Parallel.ForEach循环.它们位于System.Threading.Tasks命名空间.它们是两个方法,这两个方法将迭代分别放在不同的处理器上并行处理,如果机器是多处理器或多核处理器,这样就会使性能大大提升. 2.例子用Parallel.For做计算,为数组赋值并打印,用Parallel.ForEach计算字符串数组每个元素的长度,运行结果:

iOS开发-方法调用在运行时的过程

方法调用在运行时的过程 如果用实例对象调用实例方法,会到实例的isa指针指向的对象(也就是类对象)操作. 如果调用的是类方法,就会到类对象的isa指针指向的对象(也就是元类对象)中操作. 首先,在相应操作的对象中的缓存方法列表中找调用的方法,如果找到,转向相应实现并执行. 如果没找到,在相应操作的对象中的方法列表中找调用的方法,如果找到,转向相应实现执行 如果没找到,去父类指针所指向的对象中执行1,2. 以此类推,如果一直到根类还没找到,转向拦截调用. 如果没有重写拦截调用的方法,程序报错. 以

python 魔法方法,属性,迭代

9.2 构造方法 python 中也属于自己的构造函数和析构函数, class fibs: def __init__(self): self.a = 0 self.b = 1 def next(self): self.a,self.b = self.b,self.a+self.b return self.a def __iter__(self): return self fib = fibs() for i in fib: if i>1000: print i break 其中的__init__

动态代理 -- 不用手动编写一个代理对象,不需要编写与目标对象相同的方法,在运行时内存中动态生成代理对象。

动态代理创建的核心代码: TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance( Target.class.getClassLoader(),//与目标对象相同的类加载器 new Class[]{TargetInterface.class}, new InvocationHandler() { @Override //proxy 即该代理对象 //method 代理对象的方法,里面封装这接口中的所有方法 //arg

灵动标签的使用方法 ecms通过运行sql获取须要的记录

在某些条件下,我们要求站点的某页上显示指定的信息, 可是这样的指定假设固定去用代码写死的话,对以后的修改将会是大麻烦: 这时候sql语句的优势就凸显出来,利用sql语句仅仅须要改改数字,就能让显示的内容彻底替换: 代码例如以下: [e:loop={'select * from phome_ecms_news where id in (2452,2697,2299,2267)',4,24,0}] <li><a href="<?=$bqsr['titleurl']?>&

windows下postgresql安装失败解决方法:无法运行getlocales.exe

今天要安装postgresql但是安装的时候出现错误 Unknown error while running C:\Users\jinjin\AppData\Local\Temp\postgresql_installerxxxxxxx\getlocales.exe 网上百度对这个问题搜了一下只有3个链接,谷歌了一下后尝试解决这个方法. 主要原因应该是VC2010没有安装,但是我安装了之后还是依然报错.然后发现是我在安装安装版之前尝试使用过免安装的二进制版,在运行initdb的时候提示报错缺少一个

jq 筛选选择器,方法,隐式迭代 元素显示隐藏 淡入淡出 上拉下拉 动画 类名操作以及样式

jQuery 地址:https://jquery.com/ 历史版本:http://code.jquery.com/ 1.x:兼容 IE678 低版本浏览器 2.x:不兼容 IE678 低版本浏览器 3.x:不兼容 IE678 低版本浏览器,官方主要维护版本 入口函数 // 一下两种入口函数 相当于原生中的 DOMContentLoaded $(function () { /* DOM加载完成的入口*/ }) $(document).ready(function(){ /* DOM加载完成的入口

二叉树的四种遍历方法(递归、迭代)

一.前序遍历 前序遍历简单来讲,遍历顺序是:根节点-左子树-右子树 1.递归遍历 1 void preorder(BinTree *T) 2 { 3 if(T==NULL) 4 return; 5 cout << T->data; 6 preorder(T->left); 7 preorder(T->right); 8 } 2.迭代遍历(用栈实现) 1 void preorder2(BinTree *T) 2 { 3 //空树,直接返回 4 if(T==NULL) 5 ret

php优化方法:修改运行模式

php常用运行方式 pm = dynamic 动态分配pm = static 固定分配 php内存优化: 针对小型服务器:pm使用ondemand模式,具体配置如下: pm = ondemandpm.max_children = 5 #最大php进程数:pm.process_idle_timeout = 10s #空闲进程保持10s后自动退出,避免占用内存:pm.max_requests = 200 #php处理的最大请求数:request_terminate_timeout:php进程执行超过