Thread(线程)三

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(线程)三的主要内容,如果未能解决你的问题,请参考以下文章

java线程

Java中通过Runnable与Thread创建线程的区别

从 std::thread 获取返回码? [复制]

.NET Core多线程通关 Thread与Task

验证码逆向专栏极验三代四代点选类验证码逆向分析

C++项目三代码参考(改进版)