有个System.Windows.Forms.ProgrssBar类,这个类就可以完成进度条的操作,具体可以查MSDN

解决方案 »

  1.   

    应该不用多线程,ProgrssBar有对应进度属性,这个值等于你目前进度的比例就行了。
      

  2.   

    可以生命个BackgroundWorker的对象,它就是来执行后台线程的,比如一个需要较长时间的操作。这个类有个RunWorkerAsync()方法,这个方法会启动一个后台线程,然后产生DoWork事件。BackgroundWorker的对象可以接受处理这个事件。BackgroundWorker的对象还有个ReportProgress()方法,它会产生ProgressChanged事件,然后在这个事件的处理函数里就可以更新进度条了。
    下面给个例子:MSDN上的using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.ComponentModel;
    using System.Drawing;class FibonacciNumber : Form
    {
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.Run(new FibonacciNumber());
    } private StatusStrip progressStatusStrip;
    private ToolStripProgressBar toolStripProgressBar;
    private NumericUpDown requestedCountControl;
    private Button goButton;
    private TextBox outputTextBox;
    private BackgroundWorker backgroundWorker;
    private ToolStripStatusLabel toolStripStatusLabel;
    private int requestedCount; public FibonacciNumber()
    {
    Text = "Fibonacci";

    // Prepare the StatusStrip.
        progressStatusStrip = new StatusStrip();
    toolStripProgressBar = new ToolStripProgressBar();
    toolStripProgressBar.Enabled = false;
    toolStripStatusLabel = new ToolStripStatusLabel();
    progressStatusStrip.Items.Add(toolStripProgressBar);
    progressStatusStrip.Items.Add(toolStripStatusLabel); FlowLayoutPanel flp = new FlowLayoutPanel();
    flp.Dock = DockStyle.Top; Label beforeLabel = new Label();
    beforeLabel.Text = "Calculate the first ";
    beforeLabel.AutoSize = true;
    flp.Controls.Add(beforeLabel);
    requestedCountControl = new NumericUpDown();
    requestedCountControl.Maximum = 1000;
    requestedCountControl.Minimum = 1;
    requestedCountControl.Value = 100;
    flp.Controls.Add(requestedCountControl);
    Label afterLabel = new Label();
    afterLabel.Text = "Numbers in the Fibonacci sequence.";
    afterLabel.AutoSize = true;
    flp.Controls.Add(afterLabel);

    goButton = new Button();
    goButton.Text = "&Go";
    goButton.Click += new System.EventHandler(button1_Click);
    flp.Controls.Add(goButton); outputTextBox = new TextBox();
    outputTextBox.Multiline = true;
    outputTextBox.ReadOnly = true;
    outputTextBox.ScrollBars = ScrollBars.Vertical;
    outputTextBox.Dock = DockStyle.Fill; Controls.Add(outputTextBox);
    Controls.Add(progressStatusStrip);
    Controls.Add(flp); backgroundWorker = new BackgroundWorker();
    backgroundWorker.WorkerReportsProgress = true;
    backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
    backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
    backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);

    }
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    // This method will run on a thread other than the UI thread.
    // Be sure not to manipulate any Windows Forms controls created
    // on the UI thread from this method.
    backgroundWorker.ReportProgress(0, "Working...");
    Decimal lastlast = 0;
    Decimal last = 1;
    Decimal current;
    if (requestedCount >= 1)
    { AppendNumber(0); }
    if (requestedCount >= 2)
    { AppendNumber(1); }
    for (int i = 2; i < requestedCount; ++i)
    {
    // Calculate the number.
    checked { current = lastlast + last; }
    // Introduce some delay to simulate a more complicated calculation.
    System.Threading.Thread.Sleep(100);
    AppendNumber(current);
    backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
    // Get ready for the next iteration.
    lastlast = last;
    last = current;
    }
    backgroundWorker.ReportProgress(100, "Complete!");
    } private delegate void AppendNumberDelegate(Decimal number);
    private void AppendNumber(Decimal number)
    {
    if (outputTextBox.InvokeRequired)
    { outputTextBox.Invoke(new AppendNumberDelegate(AppendNumber), number); }
    else
    { outputTextBox.AppendText(number.ToString("N0") + Environment.NewLine); }
    }
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    toolStripProgressBar.Value = e.ProgressPercentage;
    toolStripStatusLabel.Text = e.UserState as String;
    } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    if (e.Error is OverflowException)
    { outputTextBox.AppendText(Environment.NewLine + "**OVERFLOW ERROR, number is too large to be represented by the decimal data type**"); }
    toolStripProgressBar.Enabled = false;
    requestedCountControl.Enabled = true;
    goButton.Enabled = true; } private void button1_Click(object sender, EventArgs e)
    {
    goButton.Enabled = false;
    toolStripProgressBar.Enabled = true;
    requestedCount = (int)requestedCountControl.Value;
    requestedCountControl.Enabled = false;
    outputTextBox.Clear();
    backgroundWorker.RunWorkerAsync();
    }
    }
      

  3.   

    注意 BackgroundWorker 的三个事件的写法
      

  4.   

    backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
    像这样的计算可以报告进度,那么像读写数据库之类的一系列操作怎么报告呢?
      

  5.   


    ││博客空间:http://blog.csdn.net/lovingkiss
    ││资源下载:http://download.csdn.net/user/lovingkiss
    ││Email:loving-kiss@163.com [MSN也是这个]
    ││联系方式:Q66840199 项目、聊天、咨询、探讨、统统收费,呵呵......
    ╚---------------------------------------------------------------------------------------------------------ō*︻$▅▆▇◤ 
    看我的资源,一行代码解决进度等待问题
      

  6.   

    不用的,有个progress类供你使用,你通过调整他的maxvalue,...等几个属性值就ok了
      

  7.   

    不用这么麻烦,直接拖一个processbar控件,在属性中可以设定最大值,最小值
    在程序中,的某些点,你认为可以让进度条增长的地方,就 processbar1.Value = 你想要的值,只要不超过最大值就行,在程序中分别用几个点,都这么写,每次value加一点
    然后再程序的最后 再写上processbar1.Value = 最大值 就可以了,想重置就让value = 0。
      

  8.   

    首先是你web还是winform啊?
    winform肯定要使用多线程啊,不然没反映,或者阻塞主线程
      

  9.   

    不同意3楼的“生命”backgroundWorker 控件。
    vb code :
    dim BackgroundWorker1as BackgroudWorker = new BackgroudWorker()
     BackgroundWorker1.WorkerReportsProgress = True
            AddHandler BackgroundWorker1.DoWork, AddressOf BackgoundWorker1_DoWork
            AddHandler BackgroundWorker1.RunWorkerCompleted, AddressOf Back_RunWorkerCompleted
            AddHandler BackgroundWorker1.ProgressChanged, AddressOf back_ProgressChanged
            BackgroundWorker1.RunWorkerAsync()
      

  10.   

    第二步:把你的长时间操作函数放到 DoWork 里执行,注意执行的时候不要动界面控件
    Private Sub BackgoundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
            长时间操作的函数()
       End Sub
      

  11.   

    第三步:在进度改变事件里更新进度条的值。Private Sub back_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
            Me.[进度条].Value = e.ProgressPercentage
            Me.Label1.Text = String.Format("加载完成%{0}", e.ProgressPercentage)
        End Sub
    这样就可以了