使用C#中的Timer每1秒更新一次UI

时间:2011-09-14 21:01:15

标签: c# timer

我的应用程序中有以下代码:

Task.Factory.StartNew( () =>
{
    progressReporter.ReportProgress(() =>
    {
        stopWatch.Start();
        lblStatus.Text = "We've begun!";
    });

    int c = 0;

    DateTime starttime = DateTime.Now;

    foreach (string file in fileList)
    {
        c++;
        csvCreator.createCSV(file);

        progressReporter.ReportProgress(() =>
        {
            //Estimated time remaining
            if (c % 100 == 0)
            {
                TimeSpan timespent = DateTime.Now - starttime;
                int secondsremaining = (int)(timespent.TotalSeconds / c * (total - c));
                TimeSpan t = TimeSpan.FromSeconds(secondsremaining);
                lblTimeRemaining.Text = string.Format("{0:D2}h:{1:D2}m:{2:D2}s",
                t.Hours,
                t.Minutes,
                t.Seconds,
                t.Milliseconds);
            }

            //Progress bar                            
            int percentComplete = (c * 100 / total);
            if ((int)percentComplete <= progressBar.Maximum)
            {
                progressBar.Value = (int)percentComplete;
            }
        }

    });      
}

现在,我的代码会检查每100次迭代并更新UI。我宁愿每秒检查一下,以提供更好的用户体验。

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:2)

您可以使用timer对象

答案 1 :(得分:1)

而不是if (c%100==0),请查找您的stopWatch:它是否达到1秒?如果是 - >更新ui。

当然,请在每次更新UI后重置stopWatch

也就是说,请注意更新UI需要消息循环运行。如果UI线程卡在文件处理循环中,则UI将无法正确更新。