Приложение Xamarin не получает измерения сенсоров на равном расстоянии - PullRequest
1 голос
/ 11 апреля 2019

Этот вопрос может быть связан с другим вопросом Я задавал некоторое время назад. Однако сейчас ситуация немного другая.

В настоящее время я разрабатываю приложение для Android с Xamarin, которое взаимодействует через соединение Wi-Fi с некоторым нестандартным оборудованием, содержащим датчик. Работа моего приложения состоит в том, чтобы извлекать данные датчика с аппаратного обеспечения и сохранять их на телефоне , не отображая их (таким образом, рендеринг не выполняется). Я хотел бы получить непрерывный поток данных с равноудаленными временными расстояниями между всеми измерениями. К сожалению, это не тот случай, так как на следующем графике четко показано время, необходимое для получения одного измерения за другим в миллисекундах: Plot illustrating the temporal distances between my measurements

Мое первоначальное предположение заключалось в том, что эти пики (до 2500 мс) коррелируют с циклами сбора мусора и поэтому решили немного поэкспериментировать. До сих пор я пробовал следующие комбинации, касающиеся алгоритма кучи памяти и GC: * ​​1012 *

  1. реализация моста = tarjan; размер детской комнаты = 256мб; Предел мягкой кучи = 512 МБ
  2. реализация моста = old; размер детской комнаты = 256мб; Предел мягкой кучи = 512 МБ
  3. реализация моста = new; размер детской комнаты = 256мб; Предел мягкой кучи = 512 МБ

Все комбинации этих параметров приводят к аналогичным результатам. Параллельный GC включен. Есть ли у вас какие-либо идеи, что может вызвать эти временные пики?

Обновление 1

Код, который я использую, по-прежнему похож на код, который я использовал в моем предыдущем вопросе:

[...]
int timeout = 1000;
while (ShootContinuously) {
    FrameCounter++;
    CancellationToken cancellationToken = new CancellationToken();
    var task = GetDataAndUpdateUIForContinuousShootingAsync(MyDisplayPlot, FrameCounter, StartTime, mainPage);
    if (await Task.WhenAny(task, Task.Delay(timeout, cancellationToken)) == task) {
        // Task completed within timeout.
        // Consider that the task may have faulted or been canceled.
        // We re-await the task so that any exceptions/cancellation is rethrown.
        await task;
    } else { // timeout/cancellation logic
        Debug.WriteLine("Task is taking too long!");
        await Client.DisconnectAndStopReadTaskAsync();
        Client = null;
        GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        Client = new MyClientSocket();
        await Client.ConnectAndStartReadTaskAsync();
        continue;
    }
}
await Client.DisconnectAndStopReadTaskAsync();

Единственное отличие состоит в том, что я больше не выполняю никаких обновлений пользовательского интерфейса.

Обновление 2

Иногда я вижу следующий вывод:

> 04-10 18:17:12.501 D/Mono    ( 8751): AOT: image 'System.IO.dll.so'
> not found: dlopen failed: library not found
> 04-10 18:17:12.503 D/Mono    ( 8751): AOT: image
> '/Users/builder/jenkins/workspace/xamarin-android-d15-9/xamarin-android/external/mono/sdks/out/android-armeabi-v7a-release/lib/mono/aot-cache/arm/System.IO.dll.so'
> not found: dlopen failed: library not found
> 04-10 18:17:12.503 D/Mono    ( 8751): Config attempting to
> parse: 'System.IO.dll.config'. 04-10 18:17:12.503 D/Mono    ( 8751):
> Config attempting to parse:
> '/Users/builder/jenkins/workspace/xamarin-android-d15-9/xamarin-android/external/mono/sdks/out/android-armeabi-v7a-release/etc/mono/assemblies/System.IO/System.IO.config'.Loaded
> assembly: System.IO.dll [External]

Может ли это быть связано с моей проблемой?

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