zoukankan      html  css  js  c++  java
  • Task总结

    直接上代码;说明直接代码里面

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1.TaskTest
    {
        public class TaskUse
        {
            /*
             *Task是微软在.Net 4.0时代推出来的,也是微软极力推荐的一种多线程的处理方式,Task看起来像一个Thread,实际上,它是在ThreadPool
             * 的基础上进行的封装,Task的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool。
             * 
             */
    
    
            /// <summary>
            /// 第一种:单独启动线程
            /// </summary>
            public void Task1()
            {
                var task = new Task(()=> {
                    Console.WriteLine("启动线程");
                });
                task.Start();
            }
    
            /// <summary>
            /// 第二种:静态方法调用,第一种的简写方式
            /// </summary>
            public void Task2()
            {
                Task.Run(()=>{
                    Console.WriteLine("启动线程");
                });
            }
    
            /// <summary>
            /// 第三种:线程池的启动方式,执行时间短,不需要开启线程开销
            /// </summary>
            public void Task3()
            {
                Task.Factory.StartNew(()=> {
                    Console.WriteLine("启动线程");
                });
            }
    
            /// <summary>
            /// 第四种:同步启动,会卡住主线程
            /// </summary>
            public void Task4()
            {
                var task = new Task(()=> {
                    Console.WriteLine("启动线程");
                });
                task.RunSynchronously();
            }
    
    
            /*
             *   Task下的线程等待和延续主要以下几类:
    
                 ①. Wait:针对单个Task的实例,可以task1.wait进行线程等待.  <Task的实例方法>
    
                 ②. WaitAny:执行的线程等待其中任何一个线程执行完毕即可执行(如果主线程执行,则卡主线程)  <Task的静态方法>
    
                 ③. WaitAll:执行的线程等待其中所有线程执行完毕方可执行(如果主线程执行,则卡主线程)       <Task的静态方法>
    
                 ④. WhenAny:与下面ContinueWith配合执行,当传入的线程中任何一个线程执行完毕,继续执行ContinueWith中的任务(属于开启新线程,不卡主线程)   <Task的静态方法>
    
                 ⑤. WhenAll:与下面ContinueWith配合执行,当传入的线程中所有线程执行完毕,继续执行ContinueWith中的任务(属于开启新线程,不卡主线程)     <Task的静态方法>
    
                 ⑥. ContinueWith:和上面WhenAny和WhenAll配合使用    <Task的实例方法>
             */
    
            /// <summary>
            /// async、await写法
            /// </summary>
            /// <param name="i"></param>
            /// <returns></returns>
            public async Task<int> Task22(int i)
            {
                return await Task.Run(() => {
    
                    Thread.Sleep(i * 1000);
                    Console.WriteLine($"当前执行线程为:{Thread.CurrentThread.ManagedThreadId},时间{DateTime.Now.ToString("hh:mm:ss fff")}");
                    return Thread.CurrentThread.ManagedThreadId;
                });
            }
    
            public Task Task221(int i)
            {
                return Task.Run(() => {
                    Thread.Sleep(i * 1000);
                    Console.WriteLine($"当前执行线程为:{Thread.CurrentThread.ManagedThreadId},时间{DateTime.Now.ToString("hh:mm:ss fff")}");
                });
            }
    
            /// <summary>
            /// 测试WaitAny
            /// </summary>
            public void TaskWait1()
            {
                Task[] tasks =new Task[5];
    
                for (int i = 0; i < 5; i++)
                {
                    tasks[i] = Task221(i);
                }
    
                int result = Task.WaitAny(tasks);
                Console.WriteLine($"执行完毕线程为:{result},时间{DateTime.Now.ToString("hh:mm:ss fff")}");
            }
            /*执行结果:
             * 当前执行线程为:7,时间10:37:18 056
             * 
               执行完毕线程为:0,时间10:37:18 060
    
               当前执行线程为:4,时间10:37:19 056
               当前执行线程为:3,时间10:37:20 057
               当前执行线程为:6,时间10:37:21 057
               当前执行线程为:5,时间10:37:22 057
             */
    
            public void TaskWait2()
            {
                Task[] tasks = new Task[5];
    
                for (int i = 0; i < 5; i++)
                {
                    tasks[i] = Task221(i);
                }
    
                Task.WaitAll(tasks);
                Console.WriteLine($"执行完毕线程为:{Thread.CurrentThread.ManagedThreadId},时间{DateTime.Now.ToString("hh:mm:ss fff")}");
            }
            /*执行结果:
             * 当前执行线程为:4,时间10:35:51 055
               当前执行线程为:3,时间10:35:52 057
               当前执行线程为:7,时间10:35:53 057
               当前执行线程为:8,时间10:35:54 060
               当前执行线程为:6,时间10:35:55 084
    
               执行完毕线程为:1,时间10:35:55 084
             */
    
    
            public void TaskWait3()
            {
                Task[] tasks = new Task[5];
    
                for (int i = 0; i < 5; i++)
                {
                    tasks[i] = Task221(i);
                }
    
                //任何线程执行完毕开启新进程继续执行
                Task.WhenAny(tasks).ContinueWith((m)=> {
                    Console.WriteLine($"执行完毕线程为:{Thread.CurrentThread.ManagedThreadId},参数{m.Id},时间{DateTime.Now.ToString("hh:mm:ss fff")}");
                });
               
            }
            /*执行结果:
              当前执行线程为:3,时间10:42:31 127
              执行完毕线程为:5,参数6,时间10:42:31 155
              当前执行线程为:4,时间10:42:32 129
              当前执行线程为:6,时间10:42:33 129
              当前执行线程为:7,时间10:42:34 128
              当前执行线程为:8,时间10:42:35 133
               */
    
            public void TaskWait4()
            {
                Task[] tasks = new Task[5];
    
                for (int i = 0; i < 5; i++)
                {
                    tasks[i] = Task221(i);
                }
    
                //所有线程执行完毕开启新进程继续执行
                Task.WhenAll(tasks).ContinueWith((m) => {
                    Console.WriteLine($"执行完毕线程为:{Thread.CurrentThread.ManagedThreadId},参数{m.Id},时间{DateTime.Now.ToString("hh:mm:ss fff")}");
                });
    
            }
            /*执行结果:
              当前执行线程为:3,时间10:44:37 197
              当前执行线程为:6,时间10:44:38 198
              当前执行线程为:5,时间10:44:39 198
              当前执行线程为:8,时间10:44:40 199
              当前执行线程为:3,时间10:44:41 202
              执行完毕线程为:4,参数6,时间10:44:41 202
            */
    
    
        }
    }
  • 相关阅读:
    .net 命名规范
    解决Swagger刷新后不能保持登录问题
    修改表结构后视图错位问题
    创建.net api文档
    编写.net core tools教程
    VuePress 侧边栏几种配置
    VS 好用快捷键
    Jenkins 修改端口
    获取当前被调用的方法
    遇到异常 add-migration Build failed 解决办法
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/13743596.html
Copyright © 2011-2022 走看看