首页 > 代码库 > Thread(线程)三

Thread(线程)三

今天我们继续接着线程讲讲,上一章提到一下task概念,

首先接着task继续往下讲,在前章节提到过Thread怎么实现其他线程完成后再让主线程继续执行的功能,那么如果Task也需要线程等待事件,该怎么实现呢?

在这里介绍四种方法。

1、ContinueWhenAny方法

              taskFactory.ContinueWhenAny(taskList.ToArray(), t =>
                {
                   //t.AsyncState
                 Console.WriteLine("这里是ContinueWhenAny {0}", Thread.CurrentThread.ManagedThreadId);
                });

这种做法是在等task对象list集合中的任何一个线程完成后执行回调函数。

技术分享

2、ContinueWhenAll方法

            taskFactory.ContinueWhenAll(taskList.ToArray(), tList =>
             {
                 Console.WriteLine("这里是ContinueWhenAll {0}", Thread.CurrentThread.ManagedThreadId);
           });

这种是等list集合全部完成后在执行,在执行回调函数

技术分享

3、WaitAny方法

            Task.WaitAny(taskList.ToArray());//执行的线程等待某一个task的完成
            Console.WriteLine("after WaitAny{0}", Thread.CurrentThread.ManagedThreadId);

技术分享

只要等待其中任何一个线程完成,就会继续后面的程序代码。

4、WaitAll方法

            Task.WaitAll(taskList.ToArray());//执行的线程等待全部的task的完成
            Console.WriteLine("after WaitAll{0}", Thread.CurrentThread.ManagedThreadId);

 技术分享

等待多有线程完成后再去执行后面程序代码。

一般来说有这四种方法,可以解决等待事件的所有需求,如果不能实现,那有可能是程序设计上有些问题了。

***********************************************************************************************************************************************

Parallel:这个是.net后面提出的概念

Parallel.Invoke(() => this.TestThread("btnParallel_Click_0")
                        , () => this.TestThread("btnParallel_Click_1")
                       , () => this.TestThread("btnParallel_Click_2")
                         , () => this.TestThread("btnParallel_Click_3")
                         , () => this.TestThread("btnParallel_Click_4"));


            //等于使用4个task,然后主线程同步invoke一个委托  然后主线程waitall

  技术分享

这种做法就是让主线程也参与在计算中,充分利用资源吧。

            Parallel.For(6, 10, t =>
            {
                string name = string.Format("For btnParallel_Click_{0}", t);
                this.TestThread(name);
            });

            Parallel.ForEach(new int[] { 5, 6, 7, 10, 8473847 }, t =>
            {
                string name = string.Format("ForEach btnParallel_Click_{0}", t);
                this.TestThread(name);
            });

            ParallelOptions parallelOptions = new ParallelOptions()
            {
                MaxDegreeOfParallelism = 5//相当于设置一个最大的线程数
            };
            Parallel.For(6, 15, (t, state) =>
                        {
                            string name = string.Format("btnParallel_Click_{0}", t);
                            this.TestThread(name);
                            Console.WriteLine(state);
                            state.Break();//退出单次循环
                            state.Stop();//退出全部的循环
                            return;
                        });

  

 

Thread(线程)三