C#中的任务和线程

1. Single thread

  • 单线程效果,线程卡顿
        //---------------------------单线程效果---------------------------
        private void button1_Click(object sender, EventArgs e)
        {
            //总耗时3+5=8秒
            Thread.Sleep(3000);
            MessageBox.Show("单线程延时三秒执行,主界面有卡顿", "友情提示");
            Thread.Sleep(5000);
            MessageBox.Show("单线程延时五秒执行,主界面有卡顿", "友情提示");
        }

2. Multiple thread

  • 用委托或者lambda实现
        //---------------------------多线程效果---------------------------
        private void button2_Click(object sender, EventArgs e)
        {
            //thread()里面需要填入一个委托,或者说方法,此处使用lambda表达式,简化程序代码
            //运行该线程不会影响到UI线程,即不会卡顿
            Thread t = new Thread(() =>
            {
                //总耗时3+5=8秒
                Thread.Sleep(3000);
                MessageBox.Show("多线程延时三秒执行,主界面无卡顿", "友情提示");
                Thread.Sleep(5000);
                MessageBox.Show("多线程延时五秒执行,主界面无卡顿", "友情提示");
            });
            t.Start();
            //如果不用lambda匿名方法,则代码如下
            //()中放入方法名,实现调用
           // Thread t1 = new Thread(threadfun);
        }

3. Task

  • 用task来做任务管理,不需要先实例化thread
        //---------------------------任务方式实现多线程---------------------------
        //推荐用法
        private void button3_Click(object sender, EventArgs e)
        {
            //开启任务方式1.()中直接填入方法名
            //Task.Run(threadfun);
            //开启任务方式2.匿名表达式
            Task.Run(() =>
            {
                //总耗时3+5=8秒
                Thread.Sleep(3000);
                MessageBox.Show("任务延时三秒执行,无卡顿", "友情提示");
                Thread.Sleep(5000);
                MessageBox.Show("任务延时五秒执行,无卡顿", "友情提示");
            });
        }

4. Synchronization

  • 同步执行方法
        //------------------------同时多线程运行------------------------
        private void button4_Click(object sender, EventArgs e)
        {
            //同步执行,总耗时5秒
            //匿名任务1
            Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("任务1延时三秒执行,无卡顿", "友情提示");
            });
            //匿名任务2
            Task.Run(() =>
            {
                Thread.Sleep(5000);
                MessageBox.Show("任务2延时五秒执行,无卡顿", "友情提示");
            });
            //两个匿名任务会同时开启
        }

5. Await

  • 异步方法,方法前用async标记,后续任务需要等await标记任务执行完毕后再执行
        //------------------------等待当前任务结束在往下执行(异步方法async)------------------------
        //await关键字
        private async void button5_Click(object sender, EventArgs e)
        {
          await  Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("任务延时三秒执行,无卡顿", "友情提示");
                Thread.Sleep(5000);
                MessageBox.Show("任务延时五秒执行,无卡顿", "友情提示");
            });

            MessageBox.Show("await:等到两个任务均执行完成后再执行该任务", "友情提示");
        }

6. WhenAll

  • 等到所有任务结束后再执行
        //------------------------等到所有任务结束后再执行------------------------
        private void button6_Click(object sender, EventArgs e)
        {
            //新建一个列表用来存放任务
            List<Task> ts = new List<Task>();
            //添加任务1
            ts.Add(Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("任务延时三秒执行,无卡顿", "友情提示");
            }));
            //添加任务2
            ts.Add(Task.Run(() =>
            {
                Thread.Sleep(5000);
                MessageBox.Show("任务延时五秒执行,无卡顿", "友情提示");
            }));
            //WhenAll..continue with
            //t表示前一个任务的内容,语句要求必须填写。此处用不到具体内容,留空就行
            Task.WhenAll(ts).ContinueWith(t => { MessageBox.Show("WhenAll:等到两个任务均执行完成后再执行该任务", "友情提示"); });
        }
posted @ 2024-05-07 13:56  不愿透露姓名的小村村  阅读(11)  评论(0编辑  收藏  举报