c# – 在异步方法完成之前,UI不会更新

c# – 在异步方法完成之前,UI不会更新,第1张

概述在我的项目中,我想显示进度指示器,从Web服务检索数据并隐藏进度指示器.如果我这样做,我目前必须等到我从webservice检索数据,然后立即更新带有结果的UI.但进度指标从未出现过.所以看来,我正在UI线程上工作或阻塞.但是哪里? 这是我的代码的简单版本: SomePage的 private async void OnItemSelected(object sender, SelectedIte 在我的项目中,我想显示进度指示器,从Web服务检索数据并隐藏进度指示器.如果我这样做,我目前必须等到我从webservice检索数据,然后立即更新带有结果的UI.但进度指标从未出现过.所以看来,我正在UI线程上工作或阻塞.但是哪里?

这是我的代码的简单版本:

SomePage的

private async voID OnItemSelected(object sender,selecteditemchangedEventArgs e){    await ShowDetailVIEw();}private async Task ShowDetailVIEw(){    var vIEw = new MyVIEw();    this.detailVIEw = vIEw;    await vIEw.LoadContent();}

SomeVIEw

public async Task LoadContent(){    var success = await LoadData();    if (success)    {        Showinformation();    }}public async Task<bool> LoadData(){    try    {        ShowLoadingProcess();        await Task.Delay(5000);        this.itemList = await WebService.Instance.GetData();        return true;    }    catch (Exception ex)    {        System.Diagnostics.DeBUG.Writeline(ex.Message);        return false;    }    finally    {        HIDeLoadingProcess();    }}private voID Showinformation(){    Device.BeginInvokeOnMainThread(() =>    {        this.grID.Clear();        foreach(var item in this.itemList)        {            GrIDItem contentItem = new GrIDItem(item);            this.grID.Children.Add(contentItem);        }    }}private voID ShowLoadingProcess(){    Device.BeginInvokeOnMainThread(() => BringProgressIndicatorToFront());}private voID HIDeLoadingProcess(){    Device.BeginInvokeOnMainThread(() => BringProgressIndicatorToBack());}

我尝试了不同的东西,我在UI和后台线程之间失去了同步.例如.在LoadData()完成之前调用了Showinformation().

有人能给我一个关于这里有什么问题的暗示吗?

解决方法 我不完全确定为什么你的代码按照它的方式行事,但是你应该考虑到Device.BeginInvokeOnMainThread()没有给出关于何时执行动作的任何承诺.在内部,它执行以下 *** 作:

// SimplifIEds_handler = new Handler(Looper.MainLooper);s_handler.Post(action);

它将您的 *** 作传递给消息队列,然后在将来的未知时间点执行 *** 作.

但是,我建议您重新考虑应用程序的体系结构.通过利用MVVM模式和数据绑定,您可以非常轻松地控制进度指示器的可见性.

在viewmodel中,您将拥有以下内容:

private bool isBusy;public bool IsBusy() {    get { return isBusy; }    set { SetProperty(ref isBusy,value); }}

在具有上述viewmodel作为其BindingContext的VIEw中,您将具有以下内容:

<ActivityIndicator IsRunning="{Binding IsBusy}" IsVisible="{Binding IsBusy}" />

现在,无论何时开始长时间运行 *** 作,只需将isBusy更改为true,VIEw就会自动显示由于绑定而运行的ActivityIndi​​cator.

总结

以上是内存溢出为你收集整理的c# – 在异步方法完成之前,UI不会更新全部内容,希望文章能够帮你解决c# – 在异步方法完成之前,UI不会更新所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1232765.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存