想在用户进行某些比较耗时的操作时,弹出个带进度条的等待窗体,不能让用户再进行其他的操作,我知道是用多线程,但是对其不熟悉,最好能有代码!!!
谢谢!!!

解决方案 »

  1.   

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Threading;
     
      private bool flag=false;
      private System.Threading.Thread timerThread;
      private int a=0;
     
    private void StopThread()
    {
     if (timerThread != null)
     {
      timerThread.Interrupt();
      timerThread = null;
     }
    }
    public void ThreadProc()
    {
     
     for (int i = 0; i < 10000; i++)
     {
      for (int j = 0; j < 10000; j++) ;
      a = a + i;
     }
     flag=true;
     
    }
    private void progress_Load(object sender, System.EventArgs e)
    {
     this.progressBar1.Minimum = 0;
     this.progressBar1.Maximum = 10000;
    }
    private void button1_Click(object sender, System.EventArgs e)
    {
     StopThread();
     timerThread = new Thread(new ThreadStart(ThreadProc));
     timerThread.IsBackground = true;
     timerThread.Start();
     while (flag == false)
     {
      while (this.progressBar1.Value < this.progressBar1.Maximum)
       this.progressBar1.Value += 1;
      if (progressBar1.Value == progressBar1.Maximum)
       this.progressBar1.Value = 0;
     }
     Form1 frm1=new Form1(a.ToString());
     frm1.Show();
    }
    }
      

  2.   

    这种也不一定需要多线程,多线程操作很麻烦,而且容易出错最好是在你耗时的操作之间更新进度条,这样很简单比如你要读1W条数据,可以每循环100次的时候改变进度条一次,然后调用进度条的Refresh方法
      

  3.   

    顶楼上的代码和见解。我增加一些。希望能给些好的提示。
    this.progressBar1.Step = 20;
    this.progressBar1.PerformStep();来设定progressBar每次增加的步长。在每执行PerformStep方法一次。可以这个思路。
      

  4.   

    http://blog.csdn.net/jinjazz/archive/2008/05/24/2477088.aspx
      

  5.   

    可以通过backgroundWorker类来做,下面是Demo。
    下面的程序示例创建了一个计算 Fibonacci 数的窗体。该计算运行于用户界面线程之外的另一个线程上,因此用户界面可在计算进行的同时继续运行,而不会出现延迟。using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Drawing;
    using System.Threading;
    using System.Windows.Forms;namespace BackgroundWorkerExample
    {
        public class FibonacciForm : System.Windows.Forms.Form
        {
            private int numberToCompute = 0;
            private int highestPercentageReached = 0;        private System.Windows.Forms.NumericUpDown numericUpDown1;
            private System.Windows.Forms.Button startAsyncButton;
            private System.Windows.Forms.Button cancelAsyncButton;
            private System.Windows.Forms.ProgressBar progressBar1;
            private System.Windows.Forms.Label resultLabel;
            private System.ComponentModel.BackgroundWorker backgroundWorker1;        public FibonacciForm()
            {
                InitializeComponent();            InitializeBackgoundWorker();
            }        // Set up the BackgroundWorker object by 
            // attaching event handlers. 
            private void InitializeBackgoundWorker()
            {
                backgroundWorker1.DoWork += 
                    new DoWorkEventHandler(backgroundWorker1_DoWork);
                backgroundWorker1.RunWorkerCompleted += 
                    new RunWorkerCompletedEventHandler(
                backgroundWorker1_RunWorkerCompleted);
                backgroundWorker1.ProgressChanged += 
                    new ProgressChangedEventHandler(
                backgroundWorker1_ProgressChanged);
            }

            private void startAsyncButton_Click(System.Object sender, 
                System.EventArgs e)
            {
                // Reset the text in the result label.
                resultLabel.Text = String.Empty;            // Disable the UpDown control until 
                // the asynchronous operation is done.
                this.numericUpDown1.Enabled = false;            // Disable the Start button until 
                // the asynchronous operation is done.
                this.startAsyncButton.Enabled = false;            // Enable the Cancel button while 
                // the asynchronous operation runs.
                this.cancelAsyncButton.Enabled = true;            // Get the value from the UpDown control.
                numberToCompute = (int)numericUpDown1.Value;            // Reset the variable for percentage tracking.
                highestPercentageReached = 0;            // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync(numberToCompute);
            }        private void cancelAsyncButton_Click(System.Object sender, 
                System.EventArgs e)
            {   
                // Cancel the asynchronous operation.
                this.backgroundWorker1.CancelAsync();            // Disable the Cancel button.
                cancelAsyncButton.Enabled = false;
            }        // This event handler is where the actual,
            // potentially time-consuming work is done.
            private void backgroundWorker1_DoWork(object sender, 
                DoWorkEventArgs e)
            {   
                // Get the BackgroundWorker that raised this event.
                BackgroundWorker worker = sender as BackgroundWorker;            // Assign the result of the computation
                // to the Result property of the DoWorkEventArgs
                // object. This is will be available to the 
                // RunWorkerCompleted eventhandler.
                e.Result = ComputeFibonacci((int)e.Argument, worker, e);
            }        // This event handler deals with the results of the
            // background operation.
            private void backgroundWorker1_RunWorkerCompleted(
                object sender, RunWorkerCompletedEventArgs e)
            {
                // First, handle the case where an exception was thrown.
                if (e.Error != null)
                {
                    MessageBox.Show(e.Error.Message);
                }
                else if (e.Cancelled)
                {
                    // Next, handle the case where the user canceled 
                    // the operation.
                    // Note that due to a race condition in 
                    // the DoWork event handler, the Cancelled
                    // flag may not have been set, even though
                    // CancelAsync was called.
                    resultLabel.Text = "Canceled";
                }
                else
                {
                    // Finally, handle the case where the operation 
                    // succeeded.
                    resultLabel.Text = e.Result.ToString();
                }            // Enable the UpDown control.
                this.numericUpDown1.Enabled = true;            // Enable the Start button.
                startAsyncButton.Enabled = true;            // Disable the Cancel button.
                cancelAsyncButton.Enabled = false;
            }        // This event handler updates the progress bar.
            private void backgroundWorker1_ProgressChanged(object sender,
                ProgressChangedEventArgs e)
            {
                this.progressBar1.Value = e.ProgressPercentage;
            }        // This is the method that does the actual work. For this
            // example, it computes a Fibonacci number and
            // reports progress as it does its work.
            long ComputeFibonacci(int n, BackgroundWorker worker, DoWorkEventArgs e)
            {
                // The parameter n must be >= 0 and <= 91.
                // Fib(n), with n > 91, overflows a long.
                if ((n < 0) || (n > 91))
                {
                    throw new ArgumentException(
                        "value must be >= 0 and <= 91", "n");
                }            long result = 0;            // Abort the operation if the user has canceled.
                // Note that a call to CancelAsync may have set 
                // CancellationPending to true just after the
                // last invocation of this method exits, so this 
                // code will not have the opportunity to set the 
                // DoWorkEventArgs.Cancel flag to true. This means
                // that RunWorkerCompletedEventArgs.Cancelled will
                // not be set to true in your RunWorkerCompleted
                // event handler. This is a race condition.            if (worker.CancellationPending)
                {   
                    e.Cancel = true;
                }
                else
                {   
                    if (n < 2)
                    {   
                        result = 1;
                    }
                    else
                    {   
                        result = ComputeFibonacci(n - 1, worker, e) + 
                                 ComputeFibonacci(n - 2, worker, e);
                    }                // Report progress as a percentage of the total task.
                    int percentComplete = 
                        (int)((float)n / (float)numberToCompute * 100);
                    if (percentComplete > highestPercentageReached)
                    {
                        highestPercentageReached = percentComplete;
                        worker.ReportProgress(percentComplete);
                    }
                }            return result;
            }

      

  6.   


    #region Windows Form Designer generated code

            private void InitializeComponent()
            {
                this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
                this.startAsyncButton = new System.Windows.Forms.Button();
                this.cancelAsyncButton = new System.Windows.Forms.Button();
                this.resultLabel = new System.Windows.Forms.Label();
                this.progressBar1 = new System.Windows.Forms.ProgressBar();
                this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
                ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
                this.SuspendLayout();
                // 
                // numericUpDown1
                // 
                this.numericUpDown1.Location = new System.Drawing.Point(16, 16);
                this.numericUpDown1.Maximum = new System.Decimal(new int[] {
                91,
                0,
                0,
                0});
                this.numericUpDown1.Minimum = new System.Decimal(new int[] {
                1,
                0,
                0,
                0});
                this.numericUpDown1.Name = "numericUpDown1";
                this.numericUpDown1.Size = new System.Drawing.Size(80, 20);
                this.numericUpDown1.TabIndex = 0;
                this.numericUpDown1.Value = new System.Decimal(new int[] {
                1,
                0,
                0,
                0});
                // 
                // startAsyncButton
                // 
                this.startAsyncButton.Location = new System.Drawing.Point(16, 72);
                this.startAsyncButton.Name = "startAsyncButton";
                this.startAsyncButton.Size = new System.Drawing.Size(120, 23);
                this.startAsyncButton.TabIndex = 1;
                this.startAsyncButton.Text = "Start Async";
                this.startAsyncButton.Click += new System.EventHandler(this.startAsyncButton_Click);
                // 
                // cancelAsyncButton
                // 
                this.cancelAsyncButton.Enabled = false;
                this.cancelAsyncButton.Location = new System.Drawing.Point(153, 72);
                this.cancelAsyncButton.Name = "cancelAsyncButton";
                this.cancelAsyncButton.Size = new System.Drawing.Size(119, 23);
                this.cancelAsyncButton.TabIndex = 2;
                this.cancelAsyncButton.Text = "Cancel Async";
                this.cancelAsyncButton.Click += new System.EventHandler(this.cancelAsyncButton_Click);
                // 
                // resultLabel
                // 
                this.resultLabel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
                this.resultLabel.Location = new System.Drawing.Point(112, 16);
                this.resultLabel.Name = "resultLabel";
                this.resultLabel.Size = new System.Drawing.Size(160, 23);
                this.resultLabel.TabIndex = 3;
                this.resultLabel.Text = "(no result)";
                this.resultLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
                // 
                // progressBar1
                // 
                this.progressBar1.Location = new System.Drawing.Point(18, 48);
                this.progressBar1.Name = "progressBar1";
                this.progressBar1.Size = new System.Drawing.Size(256, 8);
                this.progressBar1.Step = 2;
                this.progressBar1.TabIndex = 4;
                // 
                // backgroundWorker1
                // 
                this.backgroundWorker1.WorkerReportsProgress = true;
                this.backgroundWorker1.WorkerSupportsCancellation = true;
                // 
                // FibonacciForm
                // 
                this.ClientSize = new System.Drawing.Size(292, 118);
                this.Controls.Add(this.progressBar1);
                this.Controls.Add(this.resultLabel);
                this.Controls.Add(this.cancelAsyncButton);
                this.Controls.Add(this.startAsyncButton);
                this.Controls.Add(this.numericUpDown1);
                this.Name = "FibonacciForm";
                this.Text = "Fibonacci Calculator";
                ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
                this.ResumeLayout(false);        }
    #endregion        [STAThread]
            static void Main()
            {
                Application.Run(new FibonacciForm());
            }
        }
    }
      

  7.   

    private void StopThread()
    {
     if (timerThread != null)
     {
      timerThread.Interrupt();
      timerThread = null;
     }
    }
    public void ThreadProc()
    {
     
     for (int i = 0; i < 10000; i++)
     {
      for (int j = 0; j < 10000; j++) ;
      a = a + i;
     }
     flag=true;
     
    }
    private void progress_Load(object sender, System.EventArgs e)
    {
     this.progressBar1.Minimum = 0;
     this.progressBar1.Maximum = 10000;
    }
    private void button1_Click(object sender, System.EventArgs e)
    {
     StopThread();
     timerThread = new Thread(new ThreadStart(ThreadProc));
     timerThread.IsBackground = true;
     timerThread.Start();
     while (flag == false)
     {
      while (this.progressBar1.Value < this.progressBar1.Maximum)
       this.progressBar1.Value += 1;
      if (progressBar1.Value == progressBar1.Maximum)
       this.progressBar1.Value = 0;
     }
     Form1 frm1=new Form1(a.ToString());
     frm1.Show();
    }
    }