【发布时间】:2013-08-03 07:52:41
【问题描述】:
我很想知道为什么 RunWorkerCompleted 实际上会在进度条完成之前更新 UI,textBox1 文本为“完成”。为什么会这样?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(10);
backgroundWorker1.ReportProgress(i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
textBox1.Text = "Done";
}
如果我使用
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(20);
backgroundWorker1.ReportProgress(i);
MessageBox.Show(i.ToString());
}
然后它会做我期望的事情
如果我在下面尝试这个,文本框会按预期更新,但进度条不会更新
public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
textBox1.Text = e.ProgressPercentage.ToString();
progressBar1.Refresh();
}
【问题讨论】:
-
好吧,你也检查过它的进度吗(在一些输出控件中,比如文本框)
-
这应该不会发生,你检查过写日志吗?
-
如果我添加一个消息框来显示进度条更新的每次迭代,“完成”会在最后一个消息框显示后出现。如果我不这样做,那么在 UI 更新所有进度条之前会出现“完成”! for (int i = 1; i
-
在进度条完成之前更新 UI - 多少?你的整个循环只需要 1 秒
-
大约 0.3 / .4 秒
标签: c# multithreading user-interface