我有一个用C#编写的Windows表单应用程序。我经常更新表单的标题,但是标题更改和正在更新的任务栏中显示的标题之间存在很大的延迟。
强制更新/重绘我的程序的任务栏条目有什么干净的方法?如果不这样做,我该如何强制重绘整个任务栏呢?
详细说明:事实证明,更新任务栏的延迟大约固定在100毫秒,但这似乎是基于Form.Text上次修改时的延迟。如果您更快地修改文本 - 比如每隔10毫秒,则在Form.Text保持不变至少约100毫秒之前,任务栏不会更新。
操作系统:Vista 32。
答案 0 :(得分:2)
您是否尝试在更新标题后调用Form.Refresh()?
编辑:
如果您在循环中进行标题更新,则可能需要执行以下操作:
this.Invalidate();
this.Update();
Application.DoEvents();
答案 1 :(得分:2)
任务栏更新超过每100毫秒对于用户来说太快无法解决。大概你正在向用户展示某种进度或状态指示器?
如果是这样的话,你就会在不必要地做这么多的UI更新时瘫痪应用程序。处理时间更好地用于完成客户的工作。
我认为你需要重新审视你想要做的事情的UI设计方面。
答案 2 :(得分:1)
我刚做了一个简单的测试。这些变化是非常迅速的。从它的外观来看,它肯定不到500毫秒。如果您需要以更高的价格更新标题,我不会真的推荐它。一般来说,我看到最快的更新率是每秒两次。
编辑: 我使用按键事件进行了测试。当我按住键进行快速重复时,在我释放键之前它不会更新。因此,与您的设置相同。
顺便问一下,为什么你需要每10ms更新一次?请记住,Thread.Sleep(timeout)
超时小于50毫秒是不准确的。此外,10ms超时将等于100Hz,除非您使用高端显示,否则您将错过几帧。大多数普通LCD的刷新率为60Hz。而且我们的眼睛无法区分任何比25Hz更快的东西。因此,如果你想动画,40ms延迟就足够了。一般来说,我会推荐15Hz(67ms)的简单动画。如果只想滚动一些文字,2Hz就足够了。任何更快的事情都会让用户头晕目眩。
答案 3 :(得分:1)
您是否在表单中使用与此类似的代码?:
private void Form1_Load(object sender, EventArgs e)
{
Timer t = new Timer();
t.Interval = 10;
t.Tick += new EventHandler(t_Tick);
t.Start();
}
int aa = 0;
void t_Tick(object sender, EventArgs e)
{
this.Text = aa++.ToString();
}
对我来说很好 - 表单和任务栏之间没有任何延迟。
你确定你没有锁定GUI线程而不是在你的循环上调用Application.DoEvents吗?
我正在使用新的Windows 7测试版,因此它的行为很小。