我有一个应用程序生成大约20秒的随机数字,并在屏幕上的标签中随时显示随机数字。C#减速随机数字GUI显示
我想在同一个标签上显示数字,但在停止过程之前减慢数字的显示,例如5秒钟,数字的显示应该越来越平稳地减慢,直到停止在最后数。就像抽奖一样。
任何线索?
我有一个应用程序生成大约20秒的随机数字,并在屏幕上的标签中随时显示随机数字。C#减速随机数字GUI显示
我想在同一个标签上显示数字,但在停止过程之前减慢数字的显示,例如5秒钟,数字的显示应该越来越平稳地减慢,直到停止在最后数。就像抽奖一样。
任何线索?
我可以先告诉你不是做的。不要使用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 ......
考虑在不同的线程上生成这些数字。您可以为此使用BackgroundWorker,并在生成每个数字时报告进度。当你开始到达最后时,使用Thread.Sleep(毫秒)来“减慢”(freez)BackgroundWorker的作业线程,该线程正在生成指定数量的毫秒的数字,并随着您的最终数字增加这些毫秒。这应该够了吧。
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
设置BackgroundWorker的报告进度,并用它来“推动”生成的数字到UI线程。 您也可以从工具箱中将BackgroundWorker组件拖放到表单上。
这里有一个工作程序让你开始。它将Form
的Text
快速更改3秒,之后变慢。这是通过使用一个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();
}
}
}
因此,您正在寻找一种“老虎机”的样子,一堆数字经过,速度放慢,直到一个被选中? – Matthew 2013-05-13 19:01:18
完全像老虎机效果! – VAAA 2013-05-13 19:01:58
只需使用Timer()并随时更改Interval()。一些基本的计算会告诉你在每个间隔()中应该生成多少个数字,以最终总计时间为期望的数量... – 2013-05-13 19:05:36