定时器
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();
}
}
当该复选框未选中时,用户界面上没有任何操作,秒表报告在20-200毫秒之间滴答作响,如果选中该复选框(它将导致用户界面呈现计数器),则显示的计时约为20-35毫秒。如下图所示:
调度员优先权
加载
DispatcherPriority.ApplicationIdle
(或背景)当UI没有什么繁重的工作时应该可以正常工作,因此延迟是从哪里来的?有人能解释一下吗?
做了更多测试用的.NETFramework4.7.1。看起来只有当程序是由visualstudio(无论调试/发布)版本运行时才会出现问题。如果程序单独运行,则空闲/忙碌的时间安排是相似的。