我有一个应用程序可以生成大约 20 秒的随机数,并在屏幕的标签中动态显示随机数。
我想在同一个标签中显示数字,然后减慢数字的显示速度,例如在停止该过程前 5 秒,数字的显示应该越来越平稳地减慢,直到它停止在最终数字中。就像抽奖一样。
有什么线索吗?
我可以先告诉你什么不能做。不要使用Thread.Sleep
- 这样做几乎总是“最糟糕的做法”,并且会使您的 UI 无响应。
如果你Thread.Sleep
在第二个线程上使用,正如 mcl 所建议的那样,你不会冻结你的 UI,但是你会烧掉一个非常昂贵的线程来做很少的工作。
如果您使用的是 C# 4 或更早版本,那么我将创建一个计时器设置为每秒四次。处理滴答事件,如果自上次滴答事件以来已经过去了足够长的时间,则更改标签。或者,每次计时更改计时器的时间间隔。
如果您使用的是 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;
}
}
所以现在你从 5 毫秒的延迟开始,然后是 10 毫秒,然后是 20 毫秒……
这是一个帮助您入门的工作程序。它快速改变Text
3Form
秒,之后变慢。这是通过使用一个Timer
开始减速Timer
显示随机数来实现的。
public partial class Form1 : Form
{
System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer() { Interval = 10 };
System.Windows.Forms.Timer timerForStartingSlowDown = new System.Windows.Forms.Timer() { Interval = 3000 };
bool slow = false;
Random random = new Random();
public Form1()
{
InitializeComponent();
timer.Tick += timer_Tick;
timerForStartingSlowDown.Tick += timerForStartingSlowDown_Tick;
Shown += Form1_Shown;
}
void timerForStartingSlowDown_Tick(object sender, EventArgs e)
{
slow = true;
timerForStartingSlowDown.Enabled = false;
}
void Form1_Shown(object sender, EventArgs e)
{
timer.Enabled = true;
timerForStartingSlowDown.Enabled = true;
}
void timer_Tick(object sender, EventArgs e)
{
if (timer.Interval > 350) timer.Enabled = false;
else
{
if (slow) timer.Interval += 10;
Text = random.Next(1, 100).ToString();
}
}
}
考虑在不同的线程上生成这些数字。您可以为此使用 BackgroundWorker 并在生成每个数字时报告进度。当您开始到达终点时,使用 Thread.Sleep(miliseconds) 来“减慢”(冻结)BackgroundWorker 的作业线程,该线程正在生成指定毫秒数的数字,当您接近最终数字时,这些毫秒数会增加。这应该够了吧。
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
将 BackgroundWorker 设置为报告进度并使用它将生成的数字“推送”到 UI 线程。您还可以从工具箱中将 BackgroundWorker 组件拖放到表单上。