Form Not Responding when any other operation performed in C#

前端 未结 5 1087
心在旅途
心在旅途 2020-12-09 12:52

I have a form (Developed in C# using VS2010) with a Progress Bar. It\'s kind of stopwatch form where I fill the progress bar in say 10secs.... As Time elapses, Progress bar

5条回答
  •  渐次进展
    2020-12-09 13:06

    You are blocking the UI thread, which means it isn't processing events such as "paint". To do this properly, you should be using something like BackgroundWorker, and just updating the UI from the progress event.

    using System;
    using System.Windows.Forms;
    using System.ComponentModel;
    using System.Threading;
    
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyForm());
        }
    }
    
    class MyForm : Form
    {
        Button btn;
        BackgroundWorker worker;
        ProgressBar bar;
        public MyForm()
        {
            Controls.Add(btn = new Button { Text = "Click me" });
            btn.Click += new EventHandler(btn_Click);
    
            Controls.Add(bar = new ProgressBar { Dock = DockStyle.Bottom, Visible = false, Minimum = 0, Maximum = 100 });
    
            worker = new BackgroundWorker { WorkerReportsProgress = true };
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        }
    
        void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            bar.Visible = false;
            if (e.Error != null)
            {
                Text = e.Error.Message;
            }
            else if (e.Cancelled)
            {
                Text = "cancelled";
            }
            else
            {
                Text = e.Result == null ? "complete" : e.Result.ToString();
            }
            btn.Enabled = true;
        }
    
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int count = 0; count < 100; count++)
            {
                worker.ReportProgress(count);
                Thread.Sleep(50);
            }
        }
    
        void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            bar.Value = e.ProgressPercentage;
        }
    
        void btn_Click(object sender, EventArgs e)
        {
            bar.Value = 0;
            bar.Visible = true;
            btn.Enabled = false;
            worker.RunWorkerAsync();
        }
    }
    

提交回复
热议问题