健康一贴灵,专注医药行业管理信息化

跟B站 大V学习C#同步异步多线程

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace YIBUduxiancheng
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //同步的编程问题,一个任务没有执行完,下一段代码不开始
            Thread.Sleep(3000);
            MessageBox.Show("素菜做好了");
            Thread.Sleep(5000);
            MessageBox.Show("荤菜做好了");
            //执行这个程序的时候,界面是不能操作,不能拉伸移动,鼠标点击无反应
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //
            //开启两个线程,同时做菜
            Thread ts = new Thread(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("素菜做好了");
            }
                );
            ts.Start();
            Thread ts2 = new Thread(() =>
            {
                Thread.Sleep(5000);
                MessageBox.Show("荤菜做好了");
            }
             );
            ts2.Start();
            //耗时8秒,但UI界面可以使用,没有锁定
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //TASK的底层,也是调用的Thread 
            //TASK和Thread,都使用了委托,参数是一个函数 ;
            Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("素菜做好了");
                Thread.Sleep(5000);
                MessageBox.Show("荤菜做好了");
            });

            //耗时是8秒
        }

        private void button4_Click(object sender, EventArgs e)
        {

            //同时用两个任务来执行,只有5秒
            Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("素菜做好了");

            });

            Task.Run(() =>
            {

                Thread.Sleep(5000);
                MessageBox.Show("荤菜做好了");

            });
        }

        private async void button5_Click(object sender, EventArgs e)
        {
            await Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("素菜做好了");

            });

            await Task.Run(() =>
            {

                Thread.Sleep(5000);
                MessageBox.Show("荤菜做好了");

            });
            MessageBox.Show("菜都做好了,开始吃饭!");

            //这段程序的问题是,前两个任务还是并行,不是异步。
        }

        private void button6_Click(object sender, EventArgs e)
        {
            //完美解决以上问题,用到了”任务列表“;
            List<Task> ts = new List<Task>();
            ts.Add(Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("素菜做好了");

            }));
            ts.Add(Task.Run(() =>
            {
                Thread.Sleep(5000);
                MessageBox.Show("荤菜做好了");
            } ));
            //等所有任务执行完了,再执行下边的任务;
            //ContinueWith里面要有一个类型t,如:t=>{ ,不像上边的可以()=>{
            Task.WhenAll(ts).ContinueWith(t=> 
            {
                MessageBox.Show("菜都做好了,开始吃饭!");
            });
            
        }
    }
}

附B站链接:https://www.bilibili.com/video/BV16G4y1c72R/?spm_id_from=333.337.search-card.all.click&vd_source=23d19e6e207acc35deb0fc3a201bf419

posted @ 2025-06-26 20:36  一贴灵  阅读(10)  评论(0)    收藏  举报
学以致用,效率第一