gpt4 book ai didi

c# - 从异步方法更新 SystemTray ProgressIndicator 值

转载 作者:行者123 更新时间:2023-12-03 10:37:51 25 4
gpt4 key购买 nike

我有一个长期运行的后台操作,用于将用户数据与远程 Web 服务同步,并希望向用户提供有关该操作状态的反馈。 SystemTray ProgressIndicator 在 XAML 中绑定(bind)到 ViewModel 上的属性,如下所示:

<shell:SystemTray.ProgressIndicator>
<shell:ProgressIndicator IsVisible="{Binding IsSynchronizing, Mode=OneWay}"
Text="Synchronizing..."
Value="{Binding SyncProgress, Mode=OneWay}" />
</shell:SystemTray.ProgressIndicator>

此处的绑定(bind)在调用开始时正常工作。我的异步 Web 服务操作是从 ViewModel 调用的,我为它提供了一个回调,以根据操作的当前状态设置其属性的值:
RemoteServiceManager.Current.UpdateUserDataAsync((progress) =>
{
// Marshal to UI thread
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
IsSynchronizing = !progress.OperationFinished;
SyncProgress = progress.PercentComplete;

if (progress.OperationFinished)
{
OnDataChanged();
}
});
});

这种方法的问题是 UI 调度程序似乎永远不会调用操作(setter 永远不会被调用),如果我删除对调度程序的调用并直接在委托(delegate)中执行代码,则代码将在不生成异常的情况下执行,但是进度指示器上的绑定(bind)属性不会使用新的进度值更新。如何从此长时间运行的异步操作中正确更新 ProgressInidcator Value 属性?

最后一个简短的问题:我在 ProgressIndicator 上设置的值应该是 0-1 还是 0-100?

最佳答案

据我所知,调度程序不会调用您的操作的唯一情况是 UI 线程已经很忙。

调用异步方法时,会捕获当前同步上下文。异步调用完成后,您的 await 之后的代码语句在捕获的同步上下文上执行。例如,同步上下文是 UI 线程。因此,重要的是要记住,如果您在调用 await 之前处于 UI 线程中。 ,当调用完成时,您仍将处于该 UI 线程中。

此外,将任务视为线程是一个常见的错误。任务只是一个工作单元。它不一定在单独的线程中执行。实际上,如果您编写了一个异步方法但从未启动新线程,那么您的方法将在当前线程中执行。为什么会这样?仅仅是因为您并不总是需要一个线程来异步。例如,如果您只是订阅 I/O 事件,那么创建线程将浪费资源。

关于c# - 从异步方法更新 SystemTray ProgressIndicator 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18758597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com