C#减慢随机数GUI显示

时间:2013-05-13 18:58:05

标签: c# winforms

我有一个应用程序生成随机数约20秒,并在屏幕上的标签中动态显示随机数。

我想在相同的标签中显示数字但是然后减慢数字的显示,以便在停止过程前5秒钟,数字的显示应该会越来越慢地减慢直到它停在最后的数字中。像抽奖一样。

有任何线索吗?

3 个答案:

答案 0 :(得分:12)

我可以先告诉你做什么。不要使用Thread.Sleep - 这样做几乎总是“最糟糕的做法”,会让你的用户界面反应迟钝。

如果你在第二个线程上使用Thread.Sleep,正如mcl建议的那样,你不会冻结你的UI,但是你正在烧掉一个非常昂贵的线程来做很少的工作。

如果您使用的是C#4或更早版本,那么我会创建一个定时器,例如每秒四次。处理tick事件,如果自上次tick事件已经过了足够的时间,请更改标签。或者,每次滴答时更改计时器的间隔。

如果您使用的是C#5,则可以使用await Task.Delay(x)

async void Animate()
{
    int delay = 5;
    for(int i = 1; i < 10; ++i)
    {
       UpdateLabel();
       await Task.Delay(delay);
       delay = delay * 2;
    }
}

所以现在你开始延迟5ms,然后是10,然后是20 ......

答案 1 :(得分:2)

这是一个让你入门的工作程序。它会快速更改Text的{​​{1}} 3秒钟,然后变慢。这是通过使用一个Form开始减速显示随机数的Timer来实现的。

Timer

答案 2 :(得分:1)

考虑在不同的线程上生成这些数字。您可以使用BackgroundWorker并在生成每个数字时报告进度。当你开始到达最后时,使用Thread.Sleep(miliseconds)来“减慢”(freez)BackgroundWorker的作业线程,该线程生成指定数量的毫秒的数字,当你接近最终数字时增加这些毫秒数。这应该可以解决问题。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

将BackgroundWorker设置为报告进度,并使用它将生成的数字“推送”到UI线程。 您还可以从工具箱中拖放窗体上的BackgroundWorker组件。