C# 多线程方法 控制两个进度条

2025-01-02 19:58:22
推荐回答(5个)
回答1:

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Data;  
using System.Drawing;  
using System.Linq;  
using System.Text;  
using System.Windows.Forms;  
using System.Threading;  
  
namespace Demo0004  
{  
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
        }  
  
        //线程开始的时候调用的委托  
        private delegate void maxValueDelegate(int maxValue);  
        //线程执行中调用的委托  
        private delegate void nowValueDelegate(int nowValue);  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            ThreadMethod method = new ThreadMethod();  
            //先订阅一下事件  
            method.threadStartEvent += new EventHandler(method_threadStartEvent);  
            method.threadEvent += new EventHandler(method_threadEvent);  
            method.threadEndEvent += new EventHandler(method_threadEndEvent);  
  
            Thread thread = new Thread(new ThreadStart(method.runMethod));  
            thread.Start();  
        }  
  
        ///   
        /// 线程开始事件,设置进度条最大值  
        /// 但是我不能直接操作进度条,需要一个委托来替我完成  
        /// 
  
        /// ThreadMethod函数中传过来的最大值  
        ///   
        void method_threadStartEvent(object sender, EventArgs e)  
        {  
            int maxValue = Convert.ToInt32(sender);  
            maxValueDelegate max = new maxValueDelegate(setMax);  
            this.Invoke(max, maxValue);  
        }  
  
        ///   
        /// 线程执行中的事件,设置进度条当前进度  
        /// 但是我不能直接操作进度条,需要一个委托来替我完成  
        /// 
  
        /// ThreadMethod函数中传过来的当前值  
        ///   
        void method_threadEvent(object sender, EventArgs e)  
        {  
            int nowValue = Convert.ToInt32(sender);  
            nowValueDelegate now = new nowValueDelegate(setNow);  
            this.Invoke(now, nowValue);  
        }  
  
        ///   
        /// 线程完成事件  
        /// 
  
        ///   
        ///   
        void method_threadEndEvent(object sender, EventArgs e)  
        {  
            MessageBox.Show("执行已经完成!");  
        }  
  
        ///   
        /// 我被委托调用,专门设置进度条最大值的  
        /// 
  
        ///   
        private void setMax(int maxValue)  
        {  
            this.progressBar1.Maximum = maxValue;  
        }  
  
        ///   
        /// 我被委托调用,专门设置进度条当前值的  
        /// 
  
        ///   
        private void setNow(int nowValue)  
        {  
            this.progressBar1.Value = nowValue;  
        }  
    }  
  
  
    public class ThreadMethod  
    {  
        ///   
        /// 线程开始事件  
        /// 
  
        public event EventHandler threadStartEvent;  
        ///   
        /// 线程执行时事件  
        /// 
  
        public event EventHandler threadEvent;  
        ///   
        /// 线程结束事件  
        /// 
  
        public event EventHandler threadEndEvent;  
  
        public void runMethod()  
        {  
            int count = 100;      //执行多少次  
            threadStartEvent.Invoke(count, new EventArgs());//通知主界面,我开始了,count用来设置进度条的最大值  
            for (int i = 0; i < count; i++)  
            {  
                Thread.Sleep(100);//休息100毫秒,模拟执行大数据量操作  
                threadEvent.Invoke(i, new EventArgs());//通知主界面我正在执行,i表示进度条当前进度  
            }  
            threadEndEvent.Invoke(new object(), new EventArgs());//通知主界面我已经完成了  
        }  
    }

回答2:

你是两个标签页

通过不同的线程来控制这两个进度条

互不干扰

如果是winform的可以用backgroundworker来实现

或者用thread

现在不明白你遇到了什么问题

回答3:

最重要的是要实现异步。
其实就是你的代码逻辑与界面呈现,异步来做。互不干涉。
用多线程吧。
开条线程,执行你的代码,没执行一次,就触发个事件。
界面就订阅这个事件。每收到一次事件就更新一下进度条。

异步的处理。
如果是 WinForm ,那就 this.BeginInvoke(.......
如果是 WPF,就 this.Dispacher.BeginInvoke(....

回答4:

开2个线程,每个线程控制一个进度条。

回答5:

Magicalsoft说的不错,再就是你这个问题问得并不是太清楚,大家回答的不会太具体