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

      

  • 相关阅读:
    迷茫之后的选择是理想
    Java 数组在内存中的结构
    Himi浅谈游戏开发de自学历程!(仅供参考)
    java+上传文件夹
    java+web+大文件上传下载
    http+断点续传
    浏览器上传大文件
    java大文件上传
    网页上传大文件
    php+大文件上传
  • 原文地址:https://www.cnblogs.com/xima/p/7282683.html
Copyright © 2020-2023  润新知