代码之家  ›  专栏  ›  技术社区  ›  Romasz Jaihind

UI空闲时DispatcherTimer延迟

  •  4
  • Romasz Jaihind  · 技术社区  · 6 年前

    定时器 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毫秒。如下图所示:

    DispatcherTimerDifference

    调度员优先权 加载 DispatcherPriority.ApplicationIdle (或背景)当UI没有什么繁重的工作时应该可以正常工作,因此延迟是从哪里来的?有人能解释一下吗?


    做了更多测试用的.NETFramework4.7.1。看起来只有当程序是由visualstudio(无论调试/发布)版本运行时才会出现问题。如果程序单独运行,则空闲/忙碌的时间安排是相似的。

    0 回复  |  直到 6 年前