1

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

我想在同一个标​​签中显示数字,然后减慢数字的显示速度,例如在停止该过程前 5 秒,数字的显示应该越来越平稳地减慢,直到它停止在最终数字中。就像抽奖一样。

有什么线索吗?

4

3 回答 3

12

我可以先告诉你什么不能做。不要使用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 毫秒……

于 2013-05-13T19:10:26.673 回答
2

这是一个帮助您入门的工作程序。它快速改变Text3Form秒,之后变慢。这是通过使用一个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-13T19:13:37.187 回答
1

考虑在不同的线程上生成这些数字。您可以为此使用 BackgroundWorker 并在生成每个数字时报告进度。当您开始到达终点时,使用 Thread.Sleep(miliseconds) 来“减慢”(冻结)BackgroundWorker 的作业线程,该线程正在生成指定毫秒数的数字,当您接近最终数字时,这些毫秒数会增加。这应该够了吧。

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

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

于 2013-05-13T19:03:51.660 回答