gpt4 book ai didi

c# - "Simple"C#时间线程出现卡顿

转载 作者:太空狗 更新时间:2023-10-30 00:17:02 24 4
gpt4 key购买 nike

我盯着这个帖子已经有一段时间了,我相信我的思绪已经停止了。认为最好的做法是,为了更新 UI TextBox 中的时间,创建我认为是获取时间并将其发回 UI 控件的简单线程.与它战斗了一段时间后,我感到很沮丧,我想我可以通过其他方式增加时间。本着冒险家的勇敢精神,我再试一次。

我在应用程序的其他地方运行了一个类似的线程,它获取一个列表并在 TabControl 中填充一个 DataGridView。我原以为过程大致相同,但我遗漏了一个关键部分。整个线程如下:

private void displayTime()
{
while (true)
{
String time;
String date;

time = DateTime.Now.TimeOfDay.ToString();
int len = time.IndexOf('.');
time = time.Substring(0, len);
date = DateTime.Now.Date.ToString();
len = date.IndexOf(' ');
date = date.Substring(0, len);

updateClock(time, date);
}
}
private void updateClock(String time, String date)
{
if (InvokeRequired)
{
BeginInvoke(new timeDel(updateClock), new object[] {time, date});
return;
}

ctrlTimeTxt.Text = time + "\n" + date;
}

上面的线程已经在不同的地方启动(试图调试),但目前在表单的 Shown 事件处理程序中。表格开始出现,但随后一切似乎都停止了。当我在线程中放置一个断点时,我可以无穷无尽,但 UI 似乎永远无法取回控制权。我错过了什么?我很乐意详细说明任何被忽略的细节。

编辑: 澄清:该线程正在处理 Shown 事件的函数中启动。 Shown 事件的描述如下:每当表单首次显示时发生。我认为这可能会消除 UI 线程调用过快的理论。 p>

最佳答案

问题是你的 while 循环产生了太多的事件以至于事件队列被淹没了:

while (true)
{
// ...
updateClock(time, date);
}

您可以使用 Timer 而不是在线程中执行此操作定期生成事件并为每个事件执行您的方法的一个步骤。这也意味着您不必使用 Invoke,因为计时器会在主线程上生成事件。

您的代码中还有另外两个错误:

  • 偶尔 TimeOfDay.ToString() 可能会输出恰好在第二次更改时命中的时间,在这种情况下,ToString() 的结果将不是“12:23:34.00000”,而只是“12:23:34"这将导致您的方法抛出异常。
  • 您正在调用 DateTime.Now 两次,但值可能在两次调用之间发生了变化。通常这无关紧要,但当它经过午夜时,它可能会显示“23:59:99.999”,但当天显示为第二天。在此应用程序中,这可能不是重大错误,但您应该养成只调用 DateTime.Now once 的习惯,当您希望日期和时间的值一致时。

修复这些错误并简化您​​的代码:

  • 在表单中添加计时器。
  • 设置定时器的Enabled在设计器中将属性设置为 true
  • 将此事件处理程序添加到 Tick事件:

    private void timer_Tick(object sender, EventArgs e)
    {
    DateTime now = DateTime.Now;
    textBox1.Text = now.ToString("HH:mm:ss\nyyyy-MM-dd");
    }

您不妨adjust the format string取决于您的需求。

关于c# - "Simple"C#时间线程出现卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3981328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com