简单的DispatchTimer Ticks仅在Win10中是不稳定的WPF



我已经在Win7和Win10上尝试过了。在Win7上,正如我所想的那样,Tick每100毫秒就会被调用一次。但在win10上,Tick在运行时被调用2次,然后停止,直到我用鼠标悬停在应用程序上,它会触发另一个Tick 1次。这很奇怪。

我正在使用System。Windows。线程。

代码都在代码后面进行测试,这一切都是为了保持简单:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TimerGeneral(true);
}
public DispatcherTimer timer = new DispatcherTimer();
int s;
public void TimerGeneral(bool estado)
{
timer.Interval = TimeSpan.FromMilliseconds(100);
if (estado && !timer.IsEnabled) { timer.Tick += timer_Tick; timer.Start(); }
else if (!estado && timer.IsEnabled) { timer.Stop(); }
}
public void timer_Tick(object sender, EventArgs e)
{
Debug.WriteLine("tick" + s++);
}
}

我有点不明白为什么Win10的工作方式不同,对不起。

请记住,当使用默认构造函数实例化DispatcherTimer时(正如您所做的那样(,计时器的Dispatcher将默认使用DispatcherPriority.Background执行!因此产生了高延迟。

通过使用适当的构造函数指定更高的优先级:

var dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal, Application.Current.Dispatcher) 

这应该可以解决您的问题
如果延迟仍然过高,请尝试DispatcherPriority.Send(小心使用(
如果操作在DispatcherPriority.Send发布到Dispatcher,则该操作将绕过队列并立即执行。

根据定时器间隔和工作负载,DispatcherPriority应尽可能低,以防止UI变得迟钝。

或者,如果Timers.Timer或任何其他计时器对您更有效,那么只需使用它。您可以使用Application.Current.Dispatcher.Invoke(Action)Application.Current.Dispatcher.InvokeAsync(Action)执行与UI相关的代码。

最新更新