Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调度员似乎太慢了_C#_Wpf_Multithreading_Timer - Fatal编程技术网

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));
    }
}