我正在构建一个Xamarin表单应用程序,我遇到了一个顽固的UI线程更新问题。我使用MVVM模式,我使用Wrapper函数进行所有Web调用。对于我的所有网络电话,我想使用加载动画页面叠加。这是通过全屏弹出页面完成的。虽然我可以调用UI线程来推送页面,但它总是被称为迟到。在实现页面推送之后,包装函数会一直运行,因此在页面加载时只会产生一个闪烁的加载动画。
我试过各种各样的线程函数'但没有成功。我不喜欢使QueryExecute异步,因为这会导致整个应用程序重构为异步。此外,并不总是从主UI线程调用QueryExecute。我尝试用Task Factories解决更新时间问题,虽然我遇到了死锁:主UI线程正在等待另一个线程结束,另一个线程调用主线程来更新UI - >僵局。如何处理' UI线程必须尽快执行给定的命令,然后继续运行/等待'问题?
摘自代码:
public LoginViewModel(Page page)
{
...
UserProfiles = App.WebDB.QueryExecute(() => App.WebDB.GetUserProfiles(IDs));
...
}
public T QueryExecute<T>(Expression<Func<T>> queryExpression)
{
T result = default(T);
...
LoadingAnimationHandler.LoadingStarted();
...
result = queryExpression.Compile().Invoke();
...
LoadingAnimationHandler.LoadingFinished();
...
return result;
}
public static void LoadingStarted()
{
Device.BeginInvokeOnMainThread(() =>
{
popUpPage = new PopupBase<int>(new LoadingPopupView());
PopupNavigation.PushAsync(popUpPage, false);
});
}
public static void LoadingFinished()
{
Device.BeginInvokeOnMainThread(() =>
{
if (popUpPage != null)
{
PopupNavigation.RemovePageAsync(popUpPage, false);
popUpPage = null;
}
});
}