如何在 C# 中使进度条在不同线程中运行

Luc*_*uan 2 c# multithreading winforms

我想使用进度条创建一个基本的多线程应用程序。这意味着当主线程忙于正在执行的大进程时,该进度条将在不同的线程上运行。我看过很多关于它的教程。但它们是多线程的,是执行大型进程的。另一种形式的进度条仅显示一个使用计时器运行和完成的简单进度条。

这是我现在的代码。

对于线程:

public void thread()
{
  Form6 for6 = new Form6();
  for6.Show();
}


TH1 = new Thread(thread);
TH1.Start();
Run Code Online (Sandbox Code Playgroud)

对于进度条(表格6内的代码)

 private void timer1_Tick(object sender, EventArgs e)
    {
        progressBar1.Increment(+1);
        if (progressBar1.Value == 99)
        {
            this.Close();
        }
    }

    private void Form6_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是这里的线程不运行 Form6。我有什么办法可以做到这一点吗?

pre*_*rem 5

您可以使用后台工作程序进行所有处理,而不是使用主线程进行大型处理。

这是一个简单的例子。

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
        }
    }
Run Code Online (Sandbox Code Playgroud)