C# WPF UI未更新,不确定原因?
我的应用程序中有一个计时器导致线程锁过多,所以我决定用循环中运行的任务替换计时器。现在,当使用任务时,我的UI属性没有正确更新。我认为这是一个线程问题,所以我将UI更新移到任务之外,并使用wait,但UI仍然无法工作。在debug中,我跟踪代码到UI,它位于主线程上,具有正确的数据,但UI从不更新。症状是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
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,我现在明白了,谢谢!为什么您使用的取消令牌源从不取消取消令牌。