这是我的代码的简单版本:
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就会自动显示由于绑定而运行的ActivityIndicator.
总结以上是内存溢出为你收集整理的c# – 在异步方法完成之前,UI不会更新全部内容,希望文章能够帮你解决c# – 在异步方法完成之前,UI不会更新所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)