ReactiveUI медленная производительность при первоначальном использовании API - PullRequest
0 голосов
/ 30 июня 2019

Я только начинаю использовать ReactiveUI для своих проектов Xamarin для Android и iOS.Я заметил, что мой фрагмент Android, который использует ReactiveUI, изначально загружается очень долго.Например, при первом вызове ReactiveCommand.Create в моем приложении это занимает около 250 миллисекунд.Аналогичная вещь при вызове OneWayBind, WhenAny, BindCommand в первый раз.Но если я снова создаю экземпляр представления и модели представления, эти методы возвращаются почти сразу (<3 мс). </p>

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);

Чтобы обойти эту проблему, яделать случайные вызовы API ReactiveUI из основного потока во время запуска заставки.Я пропускаю шаг инициализации для ReactiveUI, который я пропустил в документации?У кого-нибудь еще есть эта проблема?Это на Android, я еще не пробовал iOS.

Обновление Спасибо за ответ Гленн, вы правы.Я попытаюсь выяснить, правильны ли настройки моего проекта.Модель представления находится в проекте .NET Standard 2.0, который имеет ссылки на пакеты ReactiveUI и Fody.Мой проект 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

1 Ответ

2 голосов
/ 02 июля 2019

На данный момент способ, которым RxUI выполняет зависимую загрузку DLL, заключается в следующем: class .

Что происходит, если у него есть список жестко закодированных строк, соответствующих DLL-библиотекам NuGetпакеты у нас есть.Затем он попытается загрузить библиотеки DLL, перечисленные в списке, а затем, если найден, запустить IWantsToRegisterStuff интерфейс, содержащийся в классе.

Я полагаю, что ваша медлительность происходит из-за этой регистрации DLL.

В ближайшее время планируется заменить план в рамках этой задачи . План состоит в том, чтобы сделать так, чтобы вы вызывали метод Init в пространстве имен вашего пакета DLL для экземпляра RxApp.Эта работа появится в ReactiveUI 11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...