繁体   English   中英

循环和比较时间 C#

[英]Looping and comparing times C#

private void button1_Click(object sender, EventArgs e)
{
    backworker.RunWorkerAsync();
}

private void backworker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < 10000; i++)
    {
        label1.Text = i.ToString();
        DateTime d2 = DateTime.Now;

        label2.Text = d2.ToString();
    }
}

朋友们,我正在比较 backworker 任务完成的时间,比如完成循环任务需要多少时间

但是当我这样做时,我试图将比较放在循环之后,但它告诉我错误,因为 d2 没有声明

那么我该如何解决这个问题以比较并获得循环完成打印数字任务所花费的确切时间

我认为这可以工作:

DateTime d2 = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
   ...
}
label2.Text = (DateTime.Now - d2).ToString();

测量时间的一个好方法是使用System.Diagnostics.Stopwatch

var sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
   ...
}
label2.Text = sw.Elapsed.ToString();

您的DateTime在循环中声明,因此其 scope 仅限于循环体。 您必须在循环之前(即在循环外部)声明它以使其在循环之后可用。 但为此目的最好使用秒表

另一个问题是您试图从另一个线程而不是 UI 线程访问控件(标签)。 你不能这样做。

幸运的是, BackgroundWorker Class可以通过ProgressChanged事件与 UI 线程“对话”。

设置 BackgroundWorker:

private void button1_Click(object sender, EventArgs e)
{
    backworker.WorkerReportsProgress = true;
    backworker.RunWorkerAsync();
}

然后声明另一个将在 UI 线程中自动调用的事件处理程序:

private void Backworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    label1.Text = e.ProgressPercentage.ToString();
    var ts = (TimeSpan)e.UserState;
    label2.Text = ts.ToString(@"ss\.ff");
}

现在,将您的工人更改为

private void Backworker_DoWork(object sender, DoWorkEventArgs e)
{
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();
    for (int i = 0; i < 100; i++) {
        Thread.Sleep(100);
        backworker.ReportProgress(i, stopWatch.Elapsed);
    }
    stopWatch.Stop();
    backworker.ReportProgress(100, stopWatch.Elapsed);
}

请注意,我已经介绍了一个Thread.Sleep(100); 并将循环次数减少了 100。这是因为否则 UI 无法快速显示进度。 在真实场景中,您将用一些有用的工作替换Thread.Sleep

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM