线程——并行

在.NET4中,另一个新增的抽象线程是Parallel类。这个类定义了并行的for和 foreach的静态方法。在为for和foreach定义的语言中,循环从一个线程中运行Parallel类使用多个任务,因此使用多个线程来完成这个作业。

Parallel.For()和Paralle1.ForEach()方法多次调用同一个方法,而Parallel.InvokeO方法允许同时调用不同的方法。

1.Parallel.For()方法循环

在For()方法中,前两个参数定义了循环的开头和结束。示例从0迭代到9.第3个参数是一个Action<int>委托。整数参数是循环的迭代次数,该参数被传递给加Action<int>委托引用的方法。

Parallel.For()方法的返回类型是ParalleLoopResult结构,它提供了循环是否结束的信息。

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

            Console.ReadKey();


在ParalleI.ForO的方法体中,把索引、任务标识符和线程标识符写入控制台中。从输出可以看出,顺序是不能保证的。

 

也可以提前中断Parallel.For方法。Parallel.For方法的一个重载版本接受第3个Action<int,ParallelLoopState>类型的参数。使用这些参数定义一个方法,就可以调用ParalleLoopstate的Break()或stop0方法,以影响循环的结果。

注意,迭代的顺序没有定义。

ParallelLoopResult result = Parallel.For(0, 10, (int i,ParallelLoopState pls) =>
            {
                Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
                if (i > 5)
                    pls.Break();
            });

            Console.WriteLine(result.IsCompleted);
            Console.WriteLine(result.LowestBreakIteration);
            Console.ReadKey();

Parallel.For方法可能使用几个线程来执行循环。如果需要对每个线程进行初始化,就可以使用Parallel.For<TLocal>方法。除了form和to对应的值之外,For()方法的泛型版本还接受3个委托参数。

第一个参数的类型是Func<TLocal>,因为这里的例子对于TLocal使用字符串,所以该方法需要定义为Func<string>,即返回string的方法。这个方法仅对于用于执行迭代的每个线程调用一次。

第二个委托参数为循环体定义了委托。在示例中,该参数的类型是Func(int,,ParallelLoopState,string,string)。其中第一个参数是循环迭代,第二个参数ParallelLoopState允许停止循环,如前所述。循环体方法通过第3个参数接收从init方法返回的值,循环体方法还需要返回一个值,其类型是用泛型for参数定义的。

For()方法的最后一个参数指定一个委托Action<TLocal>;在该示例中,接收一个字符串。这个方法仅对于每个线程调用一次,这是一个线程退出方法。


2.Parallel.ForEach()方法循环

Parallel.ForEach()方法遍历实现了IEnumerable的集合,其方式类似于foreach语句,但以异步方式遍历。这里也没有确定遍历顺序。


如果需要中断循环,就可以使用ForEachO方法的重载版本和ParallelLoopState参数。其方式与前面的For()方法相同。ForEach()方法的一个重载版本也可以用于访问索引器,从而获得迭代次数,如下所示:


3.Parallel.Invoke()方法调用多个方法

如果多个任务应并行运行,就可以使用Parallel.Invoke()方法。Parallel.Invoke()方法允许传递一个Action委托数组,在其中可以指定应运行的方法。示例代码传递了要并行调用的Foo()和Bar()方法:

static void Main(string[] args)

        {

            Action a = Foo;

            a += Bar;

            a += Bar;

            a += Bar;

            a += Bar;

 

            Parallel.Invoke(a);

            Console.ReadKey();

          

        }

 

        static void Foo()

        {

            Console.WriteLine("foo");

        }

 

        static void Bar()

        {

            Console.WriteLine("Bar");}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值