• 异步多线程2


    同步单线程与异步多线程:

     2..NetFramework的几种线程的迭代

    3.Task方式的多线程应用

    private void btnTask_Click(object sender, EventArgs e)
            {
                Console.WriteLine("多个Task异步线程启动   start {0}", Thread.CurrentThread.ManagedThreadId);
                Console.WriteLine("这里是一些同步线程方法1");
                Console.WriteLine("这里是一些同步线程方法2");
                Console.WriteLine("这里是一些同步线程方法3");
                Console.WriteLine("这里是一些同步线程方法4");
                Console.WriteLine("这里是一些同步线程方法5");
                Console.WriteLine("这里是一些同步线程方法6");
    
                //分析场景,线程应用范围,有严格时间限制和先后顺序的只能单线程
                //多线程执行任务可以提升效率, 因为这些任务可以并发执行
                //多线程不能优化不可分割的任务
                List<Task> taskList = new List<Task>();
                taskList.Add(Task.Run(() => { this.CodingProcess("Manuel", "coding"); }));
                taskList.Add(Task.Run(() => { this.CodingProcess("Wellers", "writing"); }));
                taskList.Add(Task.Run(() => { this.CodingProcess("April", "eating"); }));
                taskList.Add(Task.Run(() => { this.CodingProcess("Moon", "cooking"); }));
                taskList.Add(Task.Run(() => { this.CodingProcess("MX", "cleaning"); }));
    
    
                #region 使用TaskFactory不阻塞主线程
    
                TaskFactory taskFactory = new TaskFactory();
                //等待全部任务完成后,启动一个新的task来完成后续动作
                taskList.Add(taskFactory.ContinueWhenAll(taskList.ToArray(),
                    tArray =>
                    {
                        Console.WriteLine($"项目完成,请贡献,部署联调测试 {Thread.CurrentThread.ManagedThreadId}");
                    }));//将这个线程也加入线程list,控制它在主线程执行前执行
    
                #endregion
    
                #region 等待异步线程执行结束后继续执行
    
                //            Task.Run(() =>//意味着方法体被新线程执行,不会卡界面,
                //            {//但不推荐,1.尽量不要线程套线程 2.全部由子线程完成
    
    
                Task.WaitAny(taskList.ToArray()); //阻塞当前线程,直到任一任务结束
                Console.WriteLine("项目进行到里程碑,支付20%费用");
    
                //既需要多线程来提升性能,又需要在多线程全部完成后才能执行的操作
                Task.WaitAll(taskList.ToArray()); //会阻塞当前线程,知道全部任务结束---主线程被阻塞了
                Console.WriteLine("项目验收完毕,支付费用");
                Console.WriteLine("多个Task异步线程启动   end {0}", Thread.CurrentThread.ManagedThreadId);
    
    
                //            });
    
                #endregion
    
            }

    1

  • 相关阅读:
    各种基础网络的通道数及尺寸问题记录
    LPRnet轻量级实时车牌识别,主网络代码以及论文思路简要介绍
    python保存字符串到txt文件
    python删除目录下文件大小小于某个值的方法
    pyqt5注意事项
    github上传项目,更新项目
    python删除一个目录下某个类型的文件,以及删除目录下子目录的所有文件
    redis批量删除key
    mongodb常用操作
    curl参数为List<实体类>的请求方式
  • 原文地址:https://www.cnblogs.com/Manuel/p/13426696.html
Copyright © 2020-2023  润新知