我有一个应用程序生成随机数约20秒,并在屏幕上的标签中动态显示随机数。
我想在相同的标签中显示数字但是然后减慢数字的显示,以便在停止过程前5秒钟,数字的显示应该会越来越慢地减慢直到它停在最后的数字中。像抽奖一样。
有任何线索吗?
答案 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组件。