C# 多线程1、启动2、暂停3、继续4、结束方法

效果

image

代码

    public partial class Form1 : Form
    {
        CancellationTokenSource TokenSource;
        CancellationToken cancellationToken;//退出线程用
        ManualResetEvent m;//暂停线程用

        public Form1()
        {
            InitializeComponent();
        }
        //更新UI
        private void UpdataUIStatus(int step)
        {
            if (cancellationToken.IsCancellationRequested)//停止线程
            { return; }
            m.WaitOne();//暂停线程
            if (InvokeRequired)
            {
                this.Invoke(new Action<int>(delegate (int s)//匿名委托
                {
                    this.progressBar1.Value += s;
                    this.label1.Text = this.progressBar1.Value.ToString() + "/" + this.progressBar1.Maximum.ToString();
                }), step);
            }
            else
            {
                this.progressBar1.Value += step;
                this.label1.Text = this.progressBar1.Value.ToString() + "/" + this.progressBar1.Maximum.ToString();
            }
            
        }
        //完成任务时需要调用
        private void Accomplish()
        {
            MessageBox.Show("任务完成");
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int taskCount = 10000; //任务量为10000
            this.progressBar1.Maximum = taskCount;
            this.progressBar1.Value = 0;

            DataWrite.UpdateUIDelegate += UpdataUIStatus;//前面的函数委托后面的函数执行
            DataWrite.TaskCallBack += Accomplish;//前面的函数委托后面的函数执行

            TokenSource = new CancellationTokenSource();
            cancellationToken = TokenSource.Token;//退出线程用
            m = new ManualResetEvent(true);//暂停线程用

            Task.Run(() =>
            {
                this.Invoke(new Action(() => { btnstart.Enabled = false; }));
                DataWrite.Write(taskCount);
            },cancellationToken);
        }
        
        private void btnpause_Click(object sender, EventArgs e)
        {
            m.Reset();
        }

        private void btncontinu_Click(object sender, EventArgs e)
        {
            m.Set();
        }

        private void btnstop_Click(object sender, EventArgs e)
        {
            this.Invoke(new Action(() => { btnstart.Enabled = true; }));
            TokenSource.Cancel();
            UpdataUIStatus(0);
        }
    }

    public static class DataWrite
    {
        public static Action<int> UpdateUIDelegate;//申明一个可以包裹1个int参数函数的委托
        public static Action TaskCallBack;//申明一个可以包裹1个无返回函数的委托
        public static void Write(object lineCount)
        {
            for (int i = 0; i < (int)lineCount; i++)
            {
                Thread.Sleep(100);
                UpdateUIDelegate(1);
            }
            TaskCallBack();
        }
    }

posted @ 2025-06-09 22:37  阿拉斯加王  阅读(33)  评论(0)    收藏  举报