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

 

 

 

 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

 

posted on 2020-08-03 15:48  Manuel  阅读(163)  评论(0编辑  收藏  举报