我有一个应用程序,它生成随机数大约20秒,并在屏幕上的标签中动态显示随机数。
我想在相同的标签中显示数字,但随后减慢数字的显示速度,因此在停止处理前5秒,数字的显示应该会越来越平稳地减慢,直到它停止在最终的数字中。就像抽奖一样。
有什么线索吗?
发布于 2013-05-14 03:10:27
我可以从告诉你不要做什么开始。不要使用Thread.Sleep --这样做几乎总是“最糟糕的做法”,并且会使您的UI没有响应能力。
如果你像mcl建议的那样在第二个线程上使用Thread.Sleep,你不会冻结你的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;
}
}所以现在你开始延迟5毫秒,然后10毫秒,然后20毫秒…
发布于 2013-05-14 03:13:37
这是一个可以帮助你入门的工作程序。它会快速更改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();
}
}
}发布于 2013-05-14 03:03:52
考虑在不同的线程上生成这些数字。您可以使用BackgroundWorker来执行此操作,并在生成每个数字时报告进度。当您开始到达终点时,使用Thread.Sleep( miliseconds )来“减慢”(freez)生成数字的BackgroundWorker的作业线程,该线程在指定的毫秒数内生成数字,并在您获取最终数字时增加这些毫秒数。这应该能起到作用。
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
设置BackgroundWorker以报告进度,并使用它将生成的数字“推送”到UI线程。还可以从“工具箱”中将BackgroundWorker组件拖放到窗体上。
https://stackoverflow.com/questions/16529199
复制相似问题