每秒更新标签文本

3

我正在尝试使标签每秒刷新一次,以便倒计时更新,在这方面遇到了一些问题。我对C#非常不熟,对我的初学者问题感到抱歉。

private void Form1_Load(object sender, EventArgs e)
{
    bool ephCD = true;
    int ephHours = (DateTime.Today.AddDays(1) - DateTime.Now).Hours;
    int ephMinu = (DateTime.Today.AddDays(1) - DateTime.Now).Minutes;
    int ephSecs = (DateTime.Today.AddDays(1) - DateTime.Now).Seconds;

    label1.Text = ephHours.ToString() + ":" + ephMinu.ToString() + ":" + ephSecs.ToString();

    while (ephCD == true)
    {
        label1.Refresh();
    }
}

启动程序时,它甚至没有出现。

为什么程序没有出现?


2
问题到底是什么? - Soner Gönül
当启动程序时,它甚至没有出现,我猜测while循环刷新帧速度太快了,以至于我甚至看不到它。label1的倒计时没有更新,是静态的。 - user3708761
4个回答

7
您在 Form_Load 中执行了一个无限循环。这意味着窗体将永远无法完成加载,您的程序将被卡住。
您的刷新循环需要在单独的线程上运行,或者最好取消循环并使用 Timer 而不是在无限循环上自旋锁定CPU。
Timer myTimer = new Timer(1000);
void Form1_Load()
{
     myTimer.Elapsed += UpdateLabel;
     myTimer.Start();
}

private void UpdateLabel(object sender, ElapsedEventArgs e)
{
    //Update label here
}

我需要一个UpdatePanel吗? - alansiqueira27
1
计时器命名空间是 System.Timers.Timer。 - alansiqueira27
@Seva UpdatePanel是ASP的东西,对吧?那将会有很大的不同。 - BradleyDotNET

1

while语句中更新标签不是一个好的选择,更好的方法是使用Timer类。

    var aTimer = new System.Timers.Timer(1000);
    aTimer.Elapsed += OnTimedEvent;
    aTimer.Enabled = true;


private static void OnTimedEvent(Object source, ElapsedEventArgs e)
{
    //update the label
}

1
这样做就可以了,只需复制粘贴:

这里放HTML代码

    private void Form1_Load(object sender, EventArgs e)
    {
        // To update the first time.
        label1.Text = (DateTime.Today.AddDays(1)- DateTime.Now).ToString(@"hh\:mm\:ss");
        var timer = new Timer {Interval = 1000};
        timer.Tick += (o, args) =>
        {
            label1.Text = (DateTime.Today.AddDays(1)- DateTime.Now).ToString(@"hh\:mm\:ss");
        };
        timer.Start();
    }

1
那个计时器在窗体被释放后仍会继续计时。你应该将计时器声明移到窗体级别。 - LarsTech

0

我最终采用了这个更简单的解决方案:

<script>
        var myTimer = setInterval(Atualizar, 20000);

        function Atualizar() {
            __doPostBack('UpdatePanelNew', '');
        }
    </script>

请确保您要更新的内容位于UpdatePanel中。

此代码将在每20秒请求一次回发。因此,在代码后台,我可以这样做:

protected void Page_Load(object sender, EventArgs e)
    {
        myLabel.InnerText = GetInDatabaseTheValueIwant();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接