Xamarin等待任务完成再继续

时间:2019-01-23 15:44:31

标签: c# xamarin async-await task

基本上,我正在尝试加载另一页,但是我需要另一种方法来完成初始化,因此在初始化时,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下方定义页面的地方,一旦一切都初始化了,这将返回一个页面给我,但是,我在多个地方都得到了null引用对象,有时代码可以在几次尝试下完全正常工作,这是什么呢?使我相信这是线程,如果我冲进去,它会崩溃,如果我放慢一点,通常是可以的。

我想做的是让其余的代码等到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--;
            } 

1 个答案:

答案 0 :(得分:1)

  

初始化时,ViewModel会调用服务器,因此我一直在等待它,但是,因为我需要应用程序的其余部分在继续之前进行等待,最好是异步进行

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

我的article on async MVVM data bindingsmall helper library中的更多信息。