C# 调度员似乎太慢了
我不确定这样的问题是否正确。但是,我会尝试一下 在互联网上到处都可以找到,在C# 调度员似乎太慢了,c#,wpf,multithreading,timer,C#,Wpf,Multithreading,Timer,我不确定这样的问题是否正确。但是,我会尝试一下 在互联网上到处都可以找到,在WPF中使用dispatchermer进行倒计时似乎是一种可行的方法。所以我做了 我的问题是,计时器似乎不正确(太慢) 我根据系统时钟进行检查(因此它不是100%,但足够接近) 它计算出,1分钟的系统时钟只相当于计时器的58.5秒。当60岁以下时,情况变得更加糟糕 代码(ViewModel): 我不知道我能做什么。代码中是否有我看不到的严重错误 编辑#1 正如注释所示,对每个勾号的处理比所示代码更复杂。这不仅仅是更新Cu
WPF
中使用dispatchermer
进行倒计时似乎是一种可行的方法。所以我做了
我的问题是,计时器似乎不正确(太慢)
我根据系统时钟进行检查(因此它不是100%,但足够接近)
它计算出,1分钟的系统时钟只相当于计时器的58.5秒。当60岁以下时,情况变得更加糟糕
代码(ViewModel):
我不知道我能做什么。代码中是否有我看不到的严重错误
编辑#1
正如注释所示,对每个勾号的处理比所示代码更复杂。这不仅仅是更新
CurrentTime
值。在每个刻度上启动线程是一种浪费,而且基本上是错误的做法。请参阅我更新的问题。当我不得不做更多的事情而不仅仅是在每个刻度上更新一个属性时,有什么更好的选择呢?这是一个完全不同的问题,不能回答这个信息。但可能仍然是:不要使用线程。
private readonly DispatcherTimer _timer = new DispatcherTimer(DispatcherPriority.Send, Application.Current.Dispatcher);
ctor(){
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.IsEnabled = false;
_timer.Tick += TimerOnTick;
_timer.Start();
}
private void TimerOnTick(object sender, EventArgs e)
{
HandleTimeUpdateAsync();
}
private void HandleTimeUpdateAsync()
{
new Thread(() =>
{
CurrentTime = _currentTime.Add(_currentTime < TimeSpan.FromMinutes(1) ? TimeSpan.FromMilliSeconds(-100) : TimeSpan.FromSeconds(-1));
}
}
private TimeSpan _currentTime;
private TimeSpan CurrentTime
{
get { return _currentTime; }
set
{
if (_currentTime == value)
{
return;
}
// set timer-interval to 1/10 second when last minute
if (value.TotalSeconds < 60 && _timer.Interval != new TimeSpan(0, 0, 0, 0, 100))
{
_timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
}
_currentTime = value;
OnPropertyChanged(nameof(FormattedCurrentTime));
}
}