我想在我的程序运行某些功能时显示进度条。当用户单击button1时,此功能正在运行。我使用了在后台运行的tread,但在我的程序中,这个线程在程序完成运行此函数后运行。我怎么修理它?
private void button1_Click(object sender, EventArgs e)
{
pr(sender,e);
}
public void pr(object sender, EventArgs e)
{
if (... == DialogResult.OK)
{
if (...)
{
Thread wa = new Thread(new ThreadStart(this.lad));
wa.IsBackground = true;
timer1.Interval = 500;
timer1.Start();
wa.Start();
if (... == DialogResult.OK)
{//the rest of the function}
}
}
}
private void lad()
{
int war = 10;
if (this.progressBar1.InvokeRequired)
{
progressBar1.Invoke((Del)delegate
{
for (int i = 1; i <=10; i++)
{
this.progressBar1.Value = this.progressBar1.Value + war;
}
});
}
if (progressBar1.Value == progressBar1.Maximum)
{
timer1.Stop();
MessageBox.Show("files saved");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
ladowanie_paska();
}
答案 0 :(得分:7)
我强烈建议重写代码以使用BackgroundWorker类;
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
这样可以更轻松地使用ProgressChanged事件更新用户界面
答案 1 :(得分:0)
另一种方法是,使用委托并使用progress baar函数多播同一个运行porcess的委托。 下面的代码中有相同的功能。
private void BtnWatch_Click(object sender, EventArgs e)
{
tickerDelegate1 = new TickerDelegate(SetLeftTicker);
Thread th = new Thread(new ThreadStart(DigitalTimer));
th.IsBackground = true;
th.Start();
}
private void SetLeftTicker()
{
label2.Text=DateTime.Now.ToLongTimeString();
}
public void DigitalTimer()
{
while (true)
{
label2.BeginInvoke(tickerDelegate1, new object[] {});
Thread.Sleep(1000);
}
}
private void BtnProgrss_Click(object sender, EventArgs e)
{
// progressBar1.Visible = true;
if (_flag == true)
{
tickerDelegate1 += new TickerDelegate(AnimateProgBar);
_flag = false;
}
}
private void AnimateProgBar()
{
num += 5;
if (num >= 100)
{
num = 0;
}
progressBar1.Value = num;
}
private void SetProgressBar()
{
while (true)
{
progressBar1.Invoke(tickerDelegate1, new object[] { });
//Thread.Sleep(10);
}
}