繁体   English   中英

Xamarin等待任务完成再继续

[英]Xamarin wait for task to be complete before continuing

本质上,我正在尝试加载另一个页面,但是我需要其他方法来完成初始化,在初始化时,ViewModel会调用服务器,因此我一直在等待,但是,因为我需要其余的应用程序来等待在继续之前,最好是异步进行。

try
{
   Page Page = await Task.Run(() => ReturnPageToLoad(item));
   if (Page != null)
   {
      PageToLoad = Page;
      Device.BeginInvokeOnMainThread(() =>
      {
          try
          {
              Detail = PageToLoad;
              _nav.SetLoadedPage(PageToLoad);
           }
           catch (Exception e)
           {
              Console.WriteLine($"Error in MainView: {e.Message}");
           }
      });
   }
} catch (Exception e)
{
   Console.WriteLine($"Error: {e.Message}");
}

我在try下方定义页面的地方,一旦一切都初始化,这将返回一个页面给我,但是,我在多个地方都得到空引用对象,有时代码可以在几次尝试下完全正常,这导致我相信这是线程,如果我冲进去,它会崩溃,如果我慢一点,通常是可以的。

我想做的是让其余的代码等到Page返回了某些内容。 这可能吗? 谢谢!

在ReturnPageToLoadItem方法中

            try
            {
                if (item.MenuItemType == MenuItemType.Settings)
                {
                    Page Loaded = _nav.ReturnPreLoadedPage(typeof(SettingsView));
                    await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
                    if (_nav.returnLoadedPage() != Loaded.GetType())
                    {
                        return Loaded;
                    }
                }
                else if (item.MenuItemType == MenuItemType.MyTimetable)
                {
                    Page Loaded = _nav.ReturnPreLoadedPage(typeof(TimetableView));
                    await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
                    if (_nav.returnLoadedPage() != Loaded.GetType())
                    {
                        return Loaded;
                    }
                }
                else if (item.MenuItemType == MenuItemType.Support)
                {
                    Page Loaded = _nav.ReturnPreLoadedPage(typeof(ChatView));
                    await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
                    if (_nav.returnLoadedPage() != Loaded.GetType())
                    {
                        return Loaded;
                    }
                }
                else if (item.MenuItemType == MenuItemType.Applications)
                {
                    return null;
                }
                else if (item.MenuItemType == MenuItemType.MyProfile)
                {
                    Console.WriteLine("Doesn't exist yet");
                    return null;
                }
                else if (item.MenuItemType == MenuItemType.About)
                {
                    Console.WriteLine("Doesn't exist yet");
                    return null;
                }
                else if (item.MenuItemType == MenuItemType.Home)
                {
                    Page Loaded = _nav.ReturnPreLoadedPage(typeof(HomeView));
                    await (Loaded.BindingContext as ViewModelBase).InitializeAsync(null);
                    return Loaded;
                }
            }
            catch (Exception e)
            {
                await Task.Delay(50);
                Console.WriteLine($"Failed to load on attempt {retry}: {e.Message}");
                retry--;
            } 

在初始化时,ViewModel会调用服务器,因此我已经等待了它,但是,因为我需要其余的应用程序才能继续,最好是异步地等待

我强烈建议始终将ViewModels初始化。 唯一合理的方法是将其同步加载到“正在加载”状态(并启动对服务器的调用)。 稍后,当要显示数据时,将VM 更新为“已加载”状态。 向用户显示“正在加载...”消息或微调框,而不是让他们等待远程呼叫完成,将为您的用户带来更好的体验。

在我有关异步MVVM数据绑定小型帮助程序库的 文章中有更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM