我的应用程序是一个C#Windows窗体应用程序。当用户按下“生成”按钮时,我的应用程序会创建一个新线程并运行新进程,该过程就像下面的伪代码
Loop counter = 1 to N
progressbar = counter/N
Display msg on label1
Do some tasks
Loop
progressbar = 100%
Display msg on lable1
我委托我的处理栏并标记msgs,消息显示在循环内没有问题我甚至添加了一个事件来运行Application.DoEvents(),每当标签文本发生变化时,我的上一次消息永远不会显示,我已经尝试在最后一个msg标签之后放置Application.DoEvents(),但是没有解决方案。其他人之前遇到过这种情况吗?
感谢大家的帮助!
修改
这是我编写上一个msg(循环后的那个)
的编码方式 this.BeginInvoke((MethodInvoker)delegate()
{
toolStripProgressBar1.Value = 100;
btnCancel.Enabled = false;
btnBrowse.Enabled = true;
btnSaveTo.Enabled = true;
btnGenerate.Enabled = false;
// Performance testing
lblGeneratingInfo.Text = "Generation Complete! Total Run time: " + DateTime.Now.Subtract(startDate).ToString();
});
FIXED: 我假设我试图显示的文字太长了......当我用“运行时间:”替换“生成完成:总运行时间”时,显示o_o
答案 0 :(得分:2)
您可能希望使用BackgroundWorker,它使用ReportProgress()来告知它取得了多少进展。
更新UI只应 在ReportProgress()调用的方法中发生。
答案 1 :(得分:1)
你提到这一切都发生在新线程上。但是,您还提到了DoEvents
。对我来说,这表明您正在从工作线程更新UI,这将是一个问题(另一种可能性是您在工作线程上运行,但阻止UI线程,这也是一个问题)。
您应该要求UI在UI线程上更新自己 - 然后您不需要 DoEvents
:
/* on worker thread */
string text = ...
int progress = ...
this.Invoke((MethodInvoker)delegate { /* on UI thread */
label1.Text = text;
progressBar.Value = progress;
});
/* on worker thread */