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());//通知主界面我已经完成了
}
}
你是两个标签页
通过不同的线程来控制这两个进度条
互不干扰
如果是winform的可以用backgroundworker来实现
或者用thread
现在不明白你遇到了什么问题
最重要的是要实现异步。
其实就是你的代码逻辑与界面呈现,异步来做。互不干涉。
用多线程吧。
开条线程,执行你的代码,没执行一次,就触发个事件。
界面就订阅这个事件。每收到一次事件就更新一下进度条。
异步的处理。
如果是 WinForm ,那就 this.BeginInvoke(.......
如果是 WPF,就 this.Dispacher.BeginInvoke(....
开2个线程,每个线程控制一个进度条。
Magicalsoft说的不错,再就是你这个问题问得并不是太清楚,大家回答的不会太具体