似乎 DispatcherTimer 在UI空闲时有一个奇怪的延迟 - 这是一个用来说明问题的小程序:
<DockPanel>
<TextBlock Name="UIText" DockPanel.Dock="Right" Text="Number" Margin="10"/>
<ToggleButton Margin="10" Content="Start" Click="ToggleButton_Click" Height="30"/>
<CheckBox Name="UIJobBox" Margin="10" Content="UIJob"/>
</DockPanel>
public partial class MainWindow : Window
{
private int _counter = 0;
private DispatcherTimer _timer = new DispatcherTimer(DispatcherPriority.ApplicationIdle) { Interval = TimeSpan.FromMilliseconds(25) };
private Stopwatch _watch = new Stopwatch();
public MainWindow()
{
InitializeComponent();
_timer.Tick += Timer_Tick;
}
private void Timer_Tick(object sender, EventArgs e)
{
Debug.WriteLine($"Time elapsed: {_watch.ElapsedMilliseconds}");
if (UIJobBox.IsChecked == true)
UIText.Text = _counter++.ToString();
_watch.Restart();
}
private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
if ((sender as ToggleButton).IsChecked == true)
_timer.Start();
else
_timer.Stop();
}
}
当取消选中该复选框时,UI上没有任何内容,秒表报告会在20-200毫秒内打勾,如果我们勾选复选框(这将导致UI呈现计数器),显示的时间约为20-35女士。见下图:
对于低于已加载的所有 DispatcherPriorities ,会发生这种情况。据我所知, DispatcherPriority.ApplicationIdle (或背景)应该可以正常工作,因为UI没有什么重要的,因此滞后来自何处?谁能解释一下呢?
已经做了一些测试 - 使用.NET framework 4.7.1。看起来只有在Visual Studio(无论是调试/发布)版本运行程序时才会出现问题。如果程序单独运行,则空闲/忙碌时间相似。