首页 > 其他分享 >Task学习

Task学习

时间:2024-08-15 20:50:55浏览次数:9  
标签:Task Console 学习 taskList 线程 WriteLine Parallel

1.Task的三种启动方式

            Task.Run(() => this.DoSomethingLong("btnTask_Click"));

            TaskFactory taskFactory = Task.Factory;
            taskFactory.StartNew(() => DoSomethingLong("btnTask_Click"));

            new Task(() => DoSomethingLong("btnTask_Click")).Start();

2.WhenAny、WhenAll、WaitAny、WaitAll、CintinueWith

            List<Task> taskList = new List<Task>();
            taskList.Add(Task.Run(() => this.Coding("jj", "Client")));
            taskList.Add(Task.Run(() => this.Coding("vv", "Server")));

            Task.WhenAny(taskList.ToArray()).ContinueWith(t =>  //不卡界面
            {
                Console.WriteLine("得意一下");
            });

            Task.WhenAll(taskList.ToArray()).ContinueWith(t =>  //不卡界面
            {
                Console.WriteLine("部署环境,联调测试");
            });
            //一个业务查询操作有多个数据源,首页-多线程并发,拿到全部数据后才能返回  waitAll
            //一个商品搜索操作多个数据源,只要一个结果即可 --waitAny

            Task.WaitAny(taskList.ToArray());//会阻塞当前线程,等着某个线程完成后,会进入到下一行,卡界面
            Task.WaitAny(taskList.ToArray(), 1000);//也有限时等待
            Console.WriteLine("完成某个里程碑");

            Task.WaitAll(taskList.ToArray(), 1000);//限时等待
            Task.WaitAll(taskList.ToArray());//会阻塞当前线程,等待全部任务都完成后,才进入下一行 卡界面
            Console.WriteLine("告诉甲方验证,上线使用");

3.限制线程池中的数量

            List<int> list = new List<int>();
            for(int i = 0; i < 1000; i++)
            {
                list.Add(i);
            }
            Action<int> action1 = i =>
            {
                Console.WriteLine("");
            };
            List<Task> taskList1 = new List<Task>();
            foreach (var i in list)
            {
                int k = i;
                taskList1.Add(Task.Run(() => action1.Invoke(k)));
                if (taskList1.Count > 10)
                {
                    Task.WaitAny(taskList1.ToArray());
                    taskList1 = taskList1.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();
                }
            }
            Task.WhenAll(taskList1.ToArray());

4.判断线程池中哪个线程先完成了

                List<Task> taskList2 = new List<Task>();
                TaskFactory taskFactory1 = new TaskFactory();
                taskList2.Add(taskFactory1.StartNew(o => Console.WriteLine("线程1"), "线程1"));
                taskList2.Add(taskFactory1.StartNew(o => Console.WriteLine("线程2"), "线程2"));
                taskFactory1.ContinueWhenAny(taskList2.ToArray(), t =>
                {
                    Console.WriteLine(t.AsyncState);//t.AsyncState就是我们创建时线程时传的参数;这样就可以知道是哪个线程先完成了
                });

5.如何进行回调

Task.Run(() => Console.WriteLine("jj")).ContinueWith(s => Console.WriteLine("i"));

6.如何保证执行完后的逻辑顺序

                taskList.Add(Task.WhenAll(taskList.ToArray()));
                Console.WriteLine("联调测试");
                Task.WaitAll(taskList.ToArray());
                Console.WriteLine("验收");

7.Delay延迟的使用

                Task.Delay(100);//延迟  不会卡主线程
                Thread.Sleep(100); //等待  卡

                Task.Delay(2000).ContinueWith(t =>
                {
                    Console.WriteLine("延迟之后执行的逻辑");
                });
                //delay相当于以下的逻辑
                Task.Run(() =>
                {
                    Thread.Sleep(2000);
                    Console.WriteLine("延迟之后执行的逻辑");
                });

8.Parallel的使用,并发编程,一次启动多个线程

Parallel.Invoke(() => Console.WriteLine("ee")
                , () => Console.WriteLine("rr"));

            Parallel.For(0, 5, i => Console.WriteLine($"ee{i}"));//启动多个线程

            Parallel.ForEach(new string[] { "0", "1" }, i => Console.WriteLine(i));//启动多个线程

9.控制Parallel中的并发数量

//可控制并发数量
            ParallelOptions parallelOptions = new ParallelOptions();
            parallelOptions.MaxDegreeOfParallelism = 3;
            Parallel.For(0, 10, parallelOptions, i => Console.WriteLine());

 10.Parallel中的break与stop

                ParallelOptions parallelOptions1 = new ParallelOptions();
                parallelOptions1.MaxDegreeOfParallelism = 5;
                Parallel.For(0, 40, parallelOptions1, (i, state) =>
                {
                    if (i == 15)
                    {
                        state.Break();//结束Parallel当此操作,等于continue;如果是主线程,等于Parallel都结束了
                        return;//必须带上
                    }
                    if (i == 20)
                    {
                        state.Stop();//结束Parallel全部操作,等于break
                        return;//必须带上
                    }
                });

 

标签:Task,Console,学习,taskList,线程,WriteLine,Parallel
From: https://www.cnblogs.com/guoxu486/p/18360047

相关文章

  • SQL— DDL语句学习【后端 10】
    SQL—DDL语句学习在数据管理的广阔领域中,SQL(StructuredQueryLanguage)作为操作关系型数据库的编程语言,扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准,还为我们提供了强大的工具来管理、查询和修改数据库中的数据。今天,我们将一起走进SQL的世界,了解其......
  • 【机器学习算法】梯度提升决策树
    梯度提升决策树(GradientBoostingDecisionTrees,GBDT)是一种集成学习方法,它通过结合多个弱学习器(通常是决策树)来构建一个强大的预测模型。GBDT是目前最流行和最有效的机器学习算法之一,特别适用于回归和分类任务。它在许多实际应用中表现出色,包括金融风险控制、搜索排名、......
  • C语言学习笔记 Day13(复合类型/自定义类型)
    Day13 内容梳理:目录Chapter9 复合类型(自定义类型)9.1结构体(1)结构体变量定义、初始化(2)嵌套结构体(3)结构体赋值(4)结构体和指针(5)结构体做函数参数9.2共用体(联合体)9.3枚举9.4typedef关键字Chapter9 复合类型(自定义类型)9.1结构体有时需要将不同类型的数组......
  • 小白学习微信小程序的客户端与服务端交互
    微信小程序是一种新型的应用程序,可以在微信客户端内运行。它具有轻量、快速的特点,可以快速开发和发布。在微信小程序中,客户端与服务端的交互是非常关键的一部分,通过这种交互,可以实现数据的传输和处理。接下来,我将为你详细介绍如何在微信小程序中实现客户端与服务端的交互。一......
  • [Python学习日记-6] 基本数据类型(上)
    简介    在学习数据类型之前我们要先回答一个问题:为什么计算机要有数据类型呢?计算机不是很NB,很智能吗,为什么会需要人类标注好数据的具体类型呢?这里就要从计算机的角度看一下数据是什么形式的了,举个例子:Jove和1234,这两个数据在我们看来是很清晰的,左边的是字符串,右边......
  • [rCore学习笔记 01]安装VMwareWorkStationPro
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有下载它随便找个地方下载,如果官网下载速度过慢:官网B站微信公众号知乎各大软件站这里附上我使用的版本链接VMware-workstation-f......
  • 程序员如何平衡日常编码工作与提升式学习?
    程序员如何平衡日常编码工作与提升式学习?在快速迭代的编程世界中,程序员们不仅需要高效完成日常编码任务,还需不断学习新技术、深化专业知识,以应对日益复杂的项目挑战。然而,如何在繁忙琐碎的编码工作与个人成长之间找到平衡,是不少程序员都面临的一个难题。是沉浸在日复一日的工......
  • 机器学习-卷积神经网络(CNN)
    机器学习-卷积神经网络(CNN)1.卷积神经网络的基本概念1.1卷积层(ConvolutionalLayer)1.1.1卷积操作1.1.2特征图(FeatureMap)1.2激活函数(ActivationFunction)1.2.1ReLU(RectifiedLinearUnit)1.2.2其他激活函数1.3池化层(PoolingLayer)1.3.1最大池化(MaxPooling)1.3.2......
  • 学习Java第20天
    何为方法System.out.println(),那么它是什么呢?Java是语句的集合,它们在一起执行一个功能方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最......
  • Datawhale X 魔搭 AI夏令营 第四期魔搭-AIGC文生图方向Task3笔记
    工具初探一ComfyUI应用场景探索ComfyUI剖析视频:1万字系统剖析ComfyUI|StableDiffusion:GUI全盘点  ComfyUI应用场景视频:ComfyUI应用场景探索官方Github链接:GitHub-ComfyUI官方应用的示例:ComfyUIExamples 工作流分享网站:ComfyWorkflows在魔搭使用ComfyUI:在魔搭......