我对进度条显示值有疑问。
我有这个主线程
<p></p>
<p>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();
}
} </p>
<p>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();
}
} </p>
<p>public void ProgressStep()
{
progressBar1.PerformStep();
} </p>
<p>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; </p>
<p>public progress()
{
ts=new ThreadStart(go);
th = new Thread(ts);
th.IsBackground = true;
th.Start();
} </p>
<p>public void incA()
{
a++;
if(a==100)
status = false;
} </p>
<p>private void go()
{
while (status)
{
if (a != b)
{
b = a;
if (progressEvent != null)
progressEvent(this);
}
}
th.Abort();
}
}
</p>
我的问题是如果启动主线程并调用 IncA 这个方法调用事件并且在事件中调用进度条 并且这个调用等待结束主线程 FOR
为什么要等? 谢谢
最佳答案
您在主线程中的循环阻止了“绘制”事件的发生。由于您是从该线程调用进度条的函数,因此您永远不会看到更新。
您需要将代码移动到另一个线程来完成递增。
下面是您想要使用 Button
、BackgroundWorker
和 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;
}
希望这对您有所帮助!
关于c# - progressBar独立线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2168192/