首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#降低了随机数图形用户界面的显示速度

问C#降低了随机数图形用户界面的显示速度
EN

Stack Overflow用户
提问于 2013-05-14 02:58:05
回答 3查看 1.7K关注 0票数 1

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

我想在相同的标签中显示数字,但随后减慢数字的显示速度,因此在停止处理前5秒,数字的显示应该会越来越平稳地减慢,直到它停止在最终的数字中。就像抽奖一样。

有什么线索吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-14 03:10:27

我可以从告诉你不要做什么开始。不要使用Thread.Sleep --这样做几乎总是“最糟糕的做法”,并且会使您的UI没有响应能力。

如果你像mcl建议的那样在第二个线程上使用Thread.Sleep,你不会冻结你的UI,但是你正在消耗一个极其昂贵的线程来做很少的工作。

如果您使用的是C# 4或更早版本,那么我将创建一个定时器,设置为每秒滴答四次。处理tick事件,如果自上一次tick事件以来已经过了足够的时间,则更改标签。或者,更改计时器每次滴答的时间间隔。

如果您使用的是C# 5,则可以只使用await Task.Delay(x)

代码语言:javascript
复制
async void Animate()
{
    int delay = 5;
    for(int i = 1; i < 10; ++i)
    {
       UpdateLabel();
       await Task.Delay(delay);
       delay = delay * 2;
    }
}

所以现在你开始延迟5毫秒,然后10毫秒,然后20毫秒…

票数 12
EN

Stack Overflow用户

发布于 2013-05-14 03:13:37

这是一个可以帮助你入门的工作程序。它会快速更改Form的Text 3秒,然后变慢。这是通过使用一个Timer开始减速显示随机数的Timer来实现的。

代码语言:javascript
复制
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();
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 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组件拖放到窗体上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16529199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档