标签和进度条

时间:2010-06-28 12:09:38

标签: c# windows-forms-designer

我的应用程序是一个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

2 个答案:

答案 0 :(得分:2)

您可能希望使用BackgroundWorker,它使用ReportProgress()来告知它取得了多少进展。

看看这个backgroundWorker Tutorial

更新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 */