C# WPF UI未更新,不确定原因?

C# WPF UI未更新,不确定原因?,c#,wpf,async-await,task,C#,Wpf,Async Await,Task,我的应用程序中有一个计时器导致线程锁过多,所以我决定用循环中运行的任务替换计时器。现在,当使用任务时,我的UI属性没有正确更新。我认为这是一个线程问题,所以我将UI更新移到任务之外,并使用wait,但UI仍然无法工作。在debug中,我跟踪代码到UI,它位于主线程上,具有正确的数据,但UI从不更新。症状是UI冻结,进程内存不断增长。我不知道怎么修这个。也许有人能帮忙 private static void OnStaticPropertyChanged([CallerMemberName] s

我的应用程序中有一个计时器导致线程锁过多,所以我决定用循环中运行的任务替换计时器。现在,当使用任务时,我的UI属性没有正确更新。我认为这是一个线程问题,所以我将UI更新移到任务之外,并使用wait,但UI仍然无法工作。在debug中,我跟踪代码到UI,它位于主线程上,具有正确的数据,但UI从不更新。症状是UI冻结,进程内存不断增长。我不知道怎么修这个。也许有人能帮忙

 private static void OnStaticPropertyChanged([CallerMemberName] string propertyName = null)
    { StaticPropertyChanged?.Invoke(null, new propertyChangedEventArgs(propertyName));
    }

 private void PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        Dispatcher.BeginInvoke((Action)(() =>
       {
           switch (e.PropertyName)
            {
                case "SiderealTime":
                    TextLst.Content = _util.HoursToHMS(TelescopeHardware.SiderealTime);
                    break;
                case "RightAscension":
                    TextRa.Content = _util.HoursToHMS(TelescopeHardware.RightAscension, "h ", "m ", "s", 3);
                    break;
       }));
    }

 private static async void Main_Mount_Loop()
    {            
        _cts = new CancellationTokenSource();
        var ct = _cts.Token;
        var keepGoing = true;
        while (keepGoing)
        {
            var task = Task.Run(() => 
            {
                ct.ThrowIfCancellationRequested();
                Task.Delay(1000, ct);
                MoveAxes();
                if (ct.IsCancellationRequested)
                       {
                           // Clean up here, then...
                           keepGoing = false;
                       }
            }, ct);
            await task;
            UpdateUi();
        }
    }
似乎是更适合此用途的库:

Observable
    .Interval(TimeSpan.FromSeconds(1), ThreadPoolScheduler.Instance)
    .Do(_ => MoveAxes())
    .SubscribeOn(DispatcherScheduler.Current)
    .Subscribe(_ => UpdateUi());

Task.Delay
返回一个应该等待的任务。但是它不是,也没有延迟。删除外部任务
var Task=Task.Run
,然后等待Task.Delay。应该有一些改进tah,我现在明白了,谢谢!为什么您使用的取消令牌源从不取消取消令牌。