我的DispatchTimer
遇到了一些麻烦。每隔一段时间,它就会“跳过”我的UI上显示的第二个或第二个。它始于我的MainViewModel
课程,在我的视图中显示倒计时。
public string Timer
{
get { return _timer; }
set
{
_timer = value;
OnPropertyChanged("Timer");
}
}
public MainViewModel()
{
_countDownTimer = new DispatcherTimer();
_countDownTimer.Tick += async (o, e) => await countdownTimer();
_countDownTimer.Interval = new TimeSpan(0,0,0,1);
_countDownTimer.IsEnabled = true;
_countDownTimer.Start();
}
这是倒计时到零时调用的方法:
private async Task countdownTimer()
{
TimeSpan TimeRemaining = _next - DateTime.Now;
string t = TimeRemaining.Hours + "h " + TimeRemaining.Minutes + "m " + TimeRemaining.Seconds + "s";
this.Timer = t; // display it on the UI
int secondsRemaining = (int) TimeRemaining.TotalSeconds;
if (secondsRemaining == 0)
{
// do something that takes a while
await Task.Run(() => {
refresIp();
});
}
}
旁注:
变量_next
仅提前5分钟。一旦它变为零,它将从当前时间再过5分钟:换句话说,这个倒计时每5分钟发生一次。
我不确定究竟是什么导致了这种“hickup”,但是在这种特殊情况下使用await
和Task
可能导致问题与使用线程有关。但是,根据我的理解,您使用await
和async
来处理可能需要一段时间等待结果的事情,而不是使用线程来分割特定任务,因此使用{{{} 1}}和await
。无论如何,一些见解会很棒。