Этот вопрос может быть связан с другим вопросом Я задавал некоторое время назад. Однако сейчас ситуация немного другая.
В настоящее время я разрабатываю приложение для Android с Xamarin, которое взаимодействует через соединение Wi-Fi с некоторым нестандартным оборудованием, содержащим датчик. Работа моего приложения состоит в том, чтобы извлекать данные датчика с аппаратного обеспечения и сохранять их на телефоне , не отображая их (таким образом, рендеринг не выполняется). Я хотел бы получить непрерывный поток данных с равноудаленными временными расстояниями между всеми измерениями. К сожалению, это не тот случай, так как на следующем графике четко показано время, необходимое для получения одного измерения за другим в миллисекундах:
![Plot illustrating the temporal distances between my measurements](https://i.stack.imgur.com/AXvii.png)
Мое первоначальное предположение заключалось в том, что эти пики (до 2500 мс) коррелируют с циклами сбора мусора и поэтому решили немного поэкспериментировать. До сих пор я пробовал следующие комбинации, касающиеся алгоритма кучи памяти и GC: * 1012 *
- реализация моста = tarjan; размер детской комнаты = 256мб; Предел мягкой кучи = 512 МБ
- реализация моста = old; размер детской комнаты = 256мб; Предел мягкой кучи = 512 МБ
- реализация моста = 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]
Может ли это быть связано с моей проблемой?