UI空闲时DispatcherTimer滞后

时间:2018-06-12 13:15:53

标签: c# wpf

似乎 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女士。见下图:

DispatcherTimerDifference

对于低于已加载的所有 DispatcherPriorities ,会发生这种情况。据我所知, DispatcherPriority.ApplicationIdle (或背景)应该可以正常工作,因为UI没有什么重要的,因此滞后来自何处?谁能解释一下呢?

已经做了一些测试 - 使用.NET framework 4.7.1。看起来只有在Visual Studio(无论是调试/发布)版本运行程序时才会出现问题。如果程序单独运行,则空闲/忙碌时间相似。

0 个答案:

没有答案