2

我的应用程序是一个 C# Windows 窗体应用程序。当用户按下“生成”按钮时,我的应用程序会创建一个新线程并运行新进程,该进程类似于下面的伪代码

Loop counter = 1 to N 
    progressbar = counter/N
    Display msg on label1
    Do some tasks
Loop
progressbar = 100%
Display msg on lable1

我已经委派了我的进程栏和标签消息,消息在循环中显示时没有问题我什至添加了一个事件以在标签文本更改时运行 Application.DoEvents() ,但是我的最后一个消息从未出现,我尝试将 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();
        });

修复:我假设我尝试显示的文本太长......当我将“生成完成:总运行时间”替换为“运行时间:”时,它显示 o_o

4

2 回答 2

2

您可能想使用一个使用 ReportProgress() 的 BackgroundWorker 来告诉它取得了多少进展。

看看这个backgroundWorker 教程

更新 UI 应该发生在 ReportProgress() 调用的方法中。

于 2010-06-28T12:14:04.297 回答
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 */
于 2010-06-28T12:15:17.567 回答