C# 进度条开始和停止按钮单击使用线程

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18029658/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 11:05:51  来源:igfitidea点击:

Progress bar Start and Stop on Button Click using thread

c#progress-bar

提问by coolprarun

I have created a C# windows application in that I inserted the progress bar.

我创建了一个 C# windows 应用程序,其中插入了进度条。

When a button is clicked the progress bar should appear and then it should start the process for some 2 to 3 seconds and when the process bar is completed it should be hidden.

当一个按钮被点击时,进度条应该会出现,然后它应该开始这个过程大约 2 到 3 秒,当过程条完成时它应该被隐藏。

I have used this code to solve this but its not working.

我已经使用此代码来解决这个问题,但它不起作用。

While the Progress bar is running, the label box that should be like "Generating... 45%" and after completing the label box should be "Generated 100%..", but when I insert the label its showing some errors.

当进度条运行时,标签框应该是“生成... 45%”,完成标签框后应该是“生成 100% ..”,但是当我插入标签时,它显示了一些错误。

Here is the picture before clicking the Generate button..

这是单击“生成”按钮之前的图片..

enter image description here
On Processing I Should get like this..
enter image description here
On Final Process id should be like this and the progress bar should hidden..
enter image description here

在此处输入图片说明
在处理时,我应该像这样..
在此处输入图片说明
在最终进程中,id 应该像这样,进度条应该隐藏..
在此处输入图片说明

        ProgressBar1.Visible = true;

        if (isProcessRunning)
        {
            MessageBox.Show("A process is already running.");
            return;
        }

        Thread backgroundThread = new Thread(
            new ThreadStart(() =>
            {
                isProcessRunning = true;
                for (int n = 0; n < 100; n++)
                {
                    Thread.Sleep(1);
                    progressBar1.BeginInvoke(new Action(() => progressBar1.Value = n));
                }
                MessageBox.Show("Generated!!!");


                if (progressBar1.InvokeRequired)
                    progressBar1.BeginInvoke(new Action(() => progressBar1.Value = 0));
                isProcessRunning = false;
            }

        ));

        // Start the background process thread
        backgroundThread.Start();

采纳答案by zey

I suggest you to use BackgroundWorkerto show progress bar in C# winform .
Here is an example ,

我建议您使用BackgroundWorker在 C# winform 中显示进度条。
这是一个例子,

    public partial class Form1 : Form
{
    BackgroundWorker bgw = new BackgroundWorker();       
    public Form1()
    {
        InitializeComponent();
        label1.Text = "";
        label2.Text = "";
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        bgw.WorkerReportsProgress = true;
        bgw.RunWorkerAsync();
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        int total = 57; //some number (this is your variable to change)!!

        for (int i = 0; i <= total; i++) //some number (total)
        {
            System.Threading.Thread.Sleep(100);
            int percents = (i * 100) / total;
            bgw.ReportProgress(percents, i);
            //2 arguments:
            //1. procenteges (from 0 t0 100) - i do a calcumation 
            //2. some current value!
        }
    }

    void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label1.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
        label2.Text = String.Format("Total items transfered: {0}", e.UserState);
    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
         //do the code when bgv completes its work
    }
}

You can set your progress bar's visible to false in bgw_RunWorkerCompleted.
The following links will show how to use backgroundworker
DotNetPerls
MSDN Reference
CodeProject
Good Luck :)

您可以在 中将进度条的可见性设置为 false bgw_RunWorkerCompleted
以下链接将展示如何使用backgroundworker
DotNetPerls
MSDN 参考
代码项目
祝你好运:)

回答by coolprarun

This is the Code i am using backgroundWorker..

这是我正在使用 backgroundWorker 的代码。

    public partial class Form1 : Form
{

    BackgroundWorker bgw = new BackgroundWorker();      
    public Form1()
    {
        InitializeComponent();
        label3.Text = "";


        this.StartPosition = FormStartPosition.CenterScreen;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }


    private void btn_generate_Click(object sender, EventArgs e)
    {
        progressBar1.Visible = true;
        bgw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        bgw.WorkerReportsProgress = true;
        bgw.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
       int total = 100; //some number (this is your variable to change)!!

        for (int i = 0; i <= total; i++) //some number (total)
        {
            System.Threading.Thread.Sleep(10);
            int percents = (i * 100) / 100;
            bgw.ReportProgress(percents, i);

        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label3.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
        if (e.ProgressPercentage == 100)
        {
            label3.Text = String.Format("Generated.. {0} %", e.ProgressPercentage);

        }
       // label2.Text = String.Format("Total items transfered: {0}", e.UserState);
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar1.Visible = false;
    }



}`

In this There is a problem in the below code when i click the button for first time the progress bar runs one time and if i clicked second time it runs for 2 times and so on.. other wise the code is perfectly working..

在这个下面的代码中有一个问题,当我第一次点击按钮时,进度条运行一次,如果我第二次点击它运行两次,依此类推..否则代码完美运行..