【问题标题】:ReactiveUI slow performance during initial use of the API初始使用 API 时 ReactiveUI 性能下降
【发布时间】:2019-06-30 19:26:14
【问题描述】:

我刚刚开始在我的 Xamarin Android 和 iOS 项目中使用 ReactiveUI。我注意到我使用 ReactiveUI 的 Android 片段最初需要很长时间才能加载。例如,在我的应用程序中第一次调用 ReactiveCommand.Create 时,大约需要 250 毫秒。第一次调用 OneWayBind、WhenAny、BindCommand 时类似的事情。但是,如果我再次重新实例化视图和视图模型,这些方法几乎会立即返回(

public ReactiveCommand<Unit, Unit> ButtonCommand { get; }


System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();

ButtonCommand = ReactiveCommand.Create(() => Console.WriteLine("test"));

long test = sw.ElapsedMilliseconds;
Console.WriteLine(test);

为了解决这个问题,我在启动初始屏幕期间从主线程随机调用了 ReactiveUI API。我是否遗漏了文档中遗漏的 ReactiveUI 初始化步骤?还有其他人有这个问题吗?这是在安卓上,我还没试过iOS。

更新 感谢格伦的回复,你是对的。我会尝试调查我的项目设置是否正确。视图模型位于具有 ReactiveUI 和 Fody 包引用的 .NET Standard 2.0 项目中。我的 Android 项目和 Android 库有 ReactiveUI 和 RxUI.AndroidSupport。以下是调用 ReactiveCommand.Create 时的日志。不知道为什么它甚至会探测 WinForm、WPF、XamForms...

06-30 17:39:39.178 I/mono-stdout(28083): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - start
06-30 17:39:39.222 D/Mono    (28083): Loading reference 1 of System.Core.dll asmctx DEFAULT, looking for System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.222 D/Mono    (28083): Assembly Ref addref System.Core[0x7c76e09880] -> System[0x7c76dbbf80]: 8
06-30 17:39:39.239 D/Mono    (28083): Loading reference 0 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for mscorlib, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.239 D/Mono    (28083): Assembly Ref addref Splat[0x7cd15ab900] -> mscorlib[0x7cd15a1480]: 29
06-30 17:39:39.244 D/Mono    (28083): Loading reference 4 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.244 D/Mono    (28083): Assembly Ref addref Splat[0x7cd15ab900] -> System.Core[0x7c76e09880]: 6
06-30 17:39:39.284 D/Mono    (28083): Loading reference 3 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/ReactiveUI.dll asmctx DEFAULT, looking for System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.284 D/Mono    (28083): Assembly Ref addref ReactiveUI[0x7cd15ab600] -> System.Core[0x7c76e09880]: 7
06-30 17:39:39.287 D/Mono    (28083): Loading reference 2 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/Splat.dll asmctx DEFAULT, looking for System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
06-30 17:39:39.287 D/Mono    (28083): Assembly Ref addref Splat[0x7cd15ab900] -> System[0x7c76dbbf80]: 9
06-30 17:39:39.294 D/Mono    (28083): Loading reference 7 of /storage/emulated/0/Android/data/com.philips.CareTouch.B00/files/.__override__/ReactiveUI.dll asmctx DEFAULT, looking for Mono.Android, Version=0.0.0.0, Culture=neutral, PublicKeyToken=84e04ff9cfb79065
06-30 17:39:39.294 D/Mono    (28083): Assembly Ref addref ReactiveUI[0x7cd15ab600] -> Mono.Android[0x7c76dbbd00]: 17
06-30 17:39:39.347 D/Mono    (28083): DllImport searching in: '__Internal' ('(null)').
06-30 17:39:39.347 D/Mono    (28083): Searching for 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.347 D/Mono    (28083): Probing 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.347 D/Mono    (28083): Found as 'java_interop_jnienv_call_long_method_a'.
06-30 17:39:39.360 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.XamForms.dll'.
06-30 17:39:39.360 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.XamForms.exe'.
06-30 17:39:39.366 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Winforms.dll'.
06-30 17:39:39.366 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Winforms.exe'.
06-30 17:39:39.367 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Wpf.dll'.
06-30 17:39:39.367 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Wpf.exe'.
06-30 17:39:39.368 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Uno.dll'.
06-30 17:39:39.368 D/Mono    (28083): Assembly Loader probing location: '/Users/builder/jenkins/workspace/xamarin-android-d16-1/xamarin-android/external/mono/sdks/out/android-arm64-v8a-release/lib/ReactiveUI.Uno.exe'.
06-30 17:39:39.489 I/mono-stdout(28083): XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - end
06-30 17:39:39.490 I/mono-stdout(28083): Elapsed 323

【问题讨论】:

  • 我很怀疑它会加载 DLL。
  • winforms, wpf 是由于 rxui 尝试加载依赖 DLL 的方式。它有一个 DLL 列表,它会尝试在这些 DLL 中加载和运行注册(如果存在)。大多数情况下,我们在 nuget 包中搜索已知的 DLL。

标签: xamarin.android reactive-programming reactiveui


【解决方案1】:

目前,RxUI 依赖 DLL 加载的方式是使用以下class

发生的情况是它有一个硬编码字符串列表,与我们拥有的 NuGet 包的 DLL 相匹配。然后它将尝试加载列表中列出的 DLL,如果找到,则运行该类中包含的 IWantsToRegisterStuff 接口。

我相信你的缓慢是因为这个 DLL 注册。

计划很快就替换为task 中工作的一部分,计划是这样您就可以在 DLL 包的命名空间中针对 RxApp 实例调用 Init 方法。这项工作将出现在 ReactiveUI 11 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-02
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多