progressBar单独的线程

1 c# progress-bar

我对进度条显示值有疑问.

我有这个主线程

private void button1_Click(object sender, EventArgs e) { progress prog = new progress(); progress.progressEvent += new progress.progressEventHandler(progressEvent); for(int i=0;i<100;i++) { Thread.Sleep(100); prog.incA(); } }

void progressEvent(object sender) { if (progressBar1.InvokeRequired) { //Tady mi to caka az kym nedobehne cyklus for a pak zacne tohleto fungovat progressBar1.Invoke(new ChangeProgressBarValue(ProgressStep)); } else { ProgressStep(); } }

public void ProgressStep() { progressBar1.PerformStep(); }

public class progress { private ThreadStart ts; private Thread th; private bool status = true; public delegate void progressEventHandler(object sender); public static event progressEventHandler progressEvent; private int b,a = 0;

public progress() { ts=new ThreadStart(go); th = new Thread(ts); th.IsBackground = true; th.Start(); }

public void incA() { a++; if(a==100) status = false; }

private void go() { while (status) { if (a != b) { b = a; if (progressEvent != null) progressEvent(this); } } th.Abort(); } }

我的问题是IF启动主线程并调用IncA这个方法调用事件并且在事件中是进度条调用并且这个调用等待结束主线程FOR

为何等待?谢谢

Joh*_*zen 6

主线程中的循环阻止"绘制"事件发生.由于您通过该线程调用进度条的功能,因此您永远不会看到更新.

您需要移动代码以完全递增到另一个线程.

以下是使用a Button,a BackgroundWorker和a 进行的示例示例ProgressBar:

private void button1_Click(object sender, EventArgs e)
{
    backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    for (int i = 1; i <= 100; i++)
    {
        backgroundWorker1.ReportProgress(i);
        Thread.Sleep(100);
    }
}

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
    this.progressBar1.Value = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!