c# - winform多线程进度条实现(progressBar工具)

本文介绍了一种在Winform应用中,通过创建两个线程实现程序计算期间循环进度条的方法,包括模拟耗时程序和更新进度条的详细代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0

  由于程序计算耗时较长,需要在耗时的地方加入循环滚动的进度条,经过学习和测试,分享一种Winform加载进度条的方法,经过验证可以达到既定需要,暂时没遇到明显报错,这里将实现过程与代码进行分享。

  1. 创建winform应用程序,加载一个buttom和一个ProgressBar控件,用于触发和显示进度条。
    请添加图片描述

2.写两个方法,一个模拟耗时的程序,可以替换为自己的程序,一个用于循环更新进度条ProgressBar的值,这两个方法后面会被两个线程执行。

        // 耗时程序,可以替换为自己的程序
        public void test1()
        {
            DateTime dt1 = DateTime.Now;
            double step;
            while (true)
            {
                DateTime dt2 = DateTime.Now;
                step = dt2.Subtract(dt1).TotalSeconds;
                if (step > 12 )
                {
                    break;
                }
            }
        }
		
		/// 进度条循环方法
        private void startProgress()
        {
            // 显示进度条控件.
            progressBar1.Visible = true;
            // 设置进度条最小值.
            progressBar1.Minimum = 1;
            // 设置进度条最大值.
            progressBar1.Maximum = 15;
            // 设置进度条初始值
            progressBar1.Value = 1;
            // 设置每次增加的步长
            progressBar1.Step = 1;

            // 循环执行
            int x = 0;
            while (x <= 15)
            {
                if (stop == true)
                {
                    progressBar1.Value = 15;
                    thread2.Abort();
                    break;
                }
                // 每次循环让程序休眠300毫秒
                System.Threading.Thread.Sleep(300);
                // 执行PerformStep()函数
                progressBar1.PerformStep();
                if (x == 15)
                {
                    x = 0;
                    progressBar1.Value = 1;
                    progressBar1.Step = 1;
                }
                x++;
            }
        }
  1. 在buttom点击事件下写主要的控制逻辑,思路是点击按钮后,两个线程同时启动,在test1()执行结束之前,进度条一直循环滚动;test1()执行结束后,两个线程都结束。

代码分享

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 ProgressBar
{
    public partial class Form1 : Form
    {

        bool stop;
        Thread thread2;

        public Form1()
        {
            InitializeComponent();
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // 初始化progressBar1及控制参数
            stop = false;
            progressBar1.Value = 1;
            progressBar1.Visible = false; // 进度条刚开始不显示

            bool thr1end = false;
            bool thr1over = false;

            Thread thread1 = new Thread(new ThreadStart(test1)); 
            // test1()计算用的主调方法,往往比较耗时  
            thread1.Priority = ThreadPriority.Highest;
            thread1.Start();

            thread2 = new Thread(new ThreadStart(startProgress)); // 更新进度条的值
            thread2.Start();

            // 判断当计算线程执行结束时,控制进度条线程也马上结束
            while (!thr1over)
            {
                thr1end = thread1.IsAlive;
                System.Windows.Forms.Application.DoEvents();
                if (!thr1end || thr1over)
                {
                    thread1.Interrupt();
                    thread1.Abort();
                    stop = true;
                    thr1end = false;
                    break;
                }
            }
        }

        // 耗时程序,可以替换为自己的程序
        public void test1()
        {
            DateTime dt1 = DateTime.Now;
            double step;
            while (true)
            {
                DateTime dt2 = DateTime.Now;
                step = dt2.Subtract(dt1).TotalSeconds;
                if (step > 12 )
                {
                    break;
                }
            }
        }


        // 进度条
        private void startProgress()
        {
            // 显示进度条控件.
            progressBar1.Visible = true;
            // 设置进度条最小值.
            progressBar1.Minimum = 1;
            // 设置进度条最大值.
            progressBar1.Maximum = 15;
            // 设置进度条初始值
            progressBar1.Value = 1;
            // 设置每次增加的步长
            progressBar1.Step = 1;

            // 循环执行
            int x = 0;
            while (x <= 15)
            {
                if (stop == true)
                {
                    progressBar1.Value = 15;
                    thread2.Abort();
                    break;
                }
                // 每次循环让程序休眠300毫秒
                System.Threading.Thread.Sleep(300);
                // 执行PerformStep()函数
                progressBar1.PerformStep();
                if (x == 15)
                {
                    x = 0;
                    progressBar1.Value = 1;
                    progressBar1.Step = 1;
                }
                x++;
            }
        }


    }
}

在这里插入图片描述

需要注意,可能会报以下的错,此时只用把下面代码添加在Form启动的方法的后面即可。

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咋(za)说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值