初始化 Xamarin.Forms 应用程序时找不到调用异步方法的方法

林志贤

异步/等待线程在这里让我发疯。我对异步初始化的可能性做了很多研究。

这是问题所在。我正在尝试根据当前应用程序状态将我的应用程序加载到特定页面。确定应用程序的状态。它包括扫描到数据文件夹。为了Storage API在 UWP 中使用我必须async在 Xamarin Forms 中创建一个依赖服务。

我在这里使用带有AppManager的单例模式

应用程序管理器

public class AppManager{
    public static AppManager Instance = new AppManager();
    public List<Jobs> JobList = new List<Jobs>();

    public async Task InitializeAsync(){
        JobList.AddRange(await DependencyService.Get<IFileService>().GetJobs());
    }

    public bool JobExists(string jobName){
        return JobList.Any(j => j.Name == jobName);
    }
}

当应用程序启动时,它需要JobList首先从数据文件夹加载然后查看JobList并确定要导航到的页面。

我目前想要做的是从App的构造函数调用下面的代码

应用程序.xaml.cs

InitializeComponent(); // Default

var appManager = AppManager.Instance;
appManager .InitializeAsync();
if(appManager .JobExists("JobA")){
    MainPage = new PageA();
}else{
    MainPage = new PageB();
}

这将始终让我进入,PageB因为列表是空的,因为初始化尚未完成。这是由asyncsynchronous线程中运行代码引起的

我已在此博客中阅读了多种制作异步构造函数的方法但是,他们仍然要求我await在调用中创建一个函数,这在这种情况下是不可能的。

我还尝试将整个App()构造函数代码移动到一个async Task函数中,然后InitializeAsync().Wait()在构造函数中调用但是,Xamarin Forms 会在运行时抱怨。App由具有null对参考MainPage

我想知道是否有可能在不涉及不良做法(例如异步无效)的情况下使用等待的函数实现完全初始化?我也有一些关于如何解决这种情况的想法,例如使用SystemIO而不是Storage API仍然适用于 Xamarin Forms UWP。但我真的很想深入了解async功能,而不仅仅是让它发挥作用。谢谢。

马丁·齐克蒙德

问题是 Xamarin.Forms 期望在MainPage初始化后立即设置。如果你使用asynccall,你需要等待它完成,这将不可避免地导致XF抱怨缺少页面。

这个问题有三种解决方案。

您可以在启动时显示一个临时的“加载页面”在这种情况下,您首先设置MainPage一个页面,通知用户该应用程序正在加载:

public App()
{
   MainPage = new LoadingPage();
}

然后继续执行覆盖中async操作OnStart

protected override async void OnStart()
{
   var appManager = AppManager.Instance;
   await appManager.InitializeAsync();
   if(appManager .JobExists("JobA"))
   {
      MainPage = new PageA();
   }
   else
   {
      MainPage = new PageB();
   }
}

您拥有的第二个选项是在 Xamarin.Forms初始化之前连接异步初始化任务对于 UWP,您可以转到 UWP 项目的App.xaml.cs文件并将其放在OnLaunchedXamarin.Forms 初始化之前的方法覆盖中:

protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
    ...

    var appManager = AppManager.Instance;
    await appManager.InitializeAsync();
    Xamarin.Forms.Forms.Init(e);

    ...
}

这只会延长基于 UWP 的启动画面,但在初始化 Xamarin.Forms 时,AppManager将已经初始化。

Adam Pedley这篇博文中描述了您拥有的最终选项它允许您在 UI 线程上运行任务,但会阻塞,直到使用TaskHelper完成任务

Exrin.Common.ThreadHelper.Init(SynchronizationContext.Current);
Exrin.Common.ThreadHelper.RunOnUIThread(async () => { await MyMethod(); });

这可能应该是最后的选择,因为它可以被视为一种黑客攻击,而不是一个适当的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Xamarin Forms 初始化应用程序类中的插件

来自分类Dev

Xamarin / Xamarin.Forms - 初始化 MasterDetailPage 时出现死锁?

来自分类Dev

Xamarin.iOS应用程序中在哪里初始化实例化的PCL?

来自分类Dev

Xamarin.Auth 正在重新初始化应用程序

来自分类Dev

找不到 Xamarin.Forms.Forms.Init()

来自分类Dev

从Swift初始化程序调用方法

来自分类Dev

从Swift初始化程序调用方法

来自分类Dev

Xamarin Forms应用程序架构

来自分类Dev

Xamarin.ios初始化UIView

来自分类Dev

是否可以从特定方法而不是在执行应用程序时初始化Singleton?

来自分类Dev

使用Spring Security初始化应用程序时出错:找不到net / sf / ehcache / Ehcache

来自分类Dev

在 Xamarin.Forms 中导航或关闭应用程序时如何保存应用程序的状态?

来自分类Dev

单元测试Xamarin.Forms应用程序时抛出Xamarin.Essentials.NotImplementedInReferenceAssemblyException

来自分类Dev

找不到类型的初始化程序

来自分类Dev

在Xamarin Forms中的PCL中以同步方法调用异步函数

来自分类Dev

如何在 Xamarin 应用程序的后台调用异步方法

来自分类Dev

Spring的初始化方法

来自分类Dev

初始化方法出错

来自分类Dev

异步/等待初始化方法的继承

来自分类Dev

Swift 初始化程序

来自分类Dev

应用程序初始化程序与应用程序实例初始化程序

来自分类Dev

我找不到适合Xamarin Forms的样本

来自分类Dev

使用聚合初始化和成员初始化程序初始化结构

来自分类Dev

创建Xamarin.Forms-空白Xaml应用程序(Xamarin.Forms可移植)或Android应用程序时出现多个错误

来自分类Dev

运行Xamarin.Forms应用程序时如何查找Android和iOS版本?

来自分类Dev

调用了不同的初始化方法

来自分类Dev

BeanCreationException:初始化方法的调用失败

来自分类Dev

正确的Rails初始化方法调用

来自分类Dev

通过调用方法初始化数组

Related 相关文章

  1. 1

    Xamarin Forms 初始化应用程序类中的插件

  2. 2

    Xamarin / Xamarin.Forms - 初始化 MasterDetailPage 时出现死锁?

  3. 3

    Xamarin.iOS应用程序中在哪里初始化实例化的PCL?

  4. 4

    Xamarin.Auth 正在重新初始化应用程序

  5. 5

    找不到 Xamarin.Forms.Forms.Init()

  6. 6

    从Swift初始化程序调用方法

  7. 7

    从Swift初始化程序调用方法

  8. 8

    Xamarin Forms应用程序架构

  9. 9

    Xamarin.ios初始化UIView

  10. 10

    是否可以从特定方法而不是在执行应用程序时初始化Singleton?

  11. 11

    使用Spring Security初始化应用程序时出错:找不到net / sf / ehcache / Ehcache

  12. 12

    在 Xamarin.Forms 中导航或关闭应用程序时如何保存应用程序的状态?

  13. 13

    单元测试Xamarin.Forms应用程序时抛出Xamarin.Essentials.NotImplementedInReferenceAssemblyException

  14. 14

    找不到类型的初始化程序

  15. 15

    在Xamarin Forms中的PCL中以同步方法调用异步函数

  16. 16

    如何在 Xamarin 应用程序的后台调用异步方法

  17. 17

    Spring的初始化方法

  18. 18

    初始化方法出错

  19. 19

    异步/等待初始化方法的继承

  20. 20

    Swift 初始化程序

  21. 21

    应用程序初始化程序与应用程序实例初始化程序

  22. 22

    我找不到适合Xamarin Forms的样本

  23. 23

    使用聚合初始化和成员初始化程序初始化结构

  24. 24

    创建Xamarin.Forms-空白Xaml应用程序(Xamarin.Forms可移植)或Android应用程序时出现多个错误

  25. 25

    运行Xamarin.Forms应用程序时如何查找Android和iOS版本?

  26. 26

    调用了不同的初始化方法

  27. 27

    BeanCreationException:初始化方法的调用失败

  28. 28

    正确的Rails初始化方法调用

  29. 29

    通过调用方法初始化数组

热门标签

归档