Дедлок UI потока при попытке обновить график
Расскажу вкратце:
мобильное приложение - Xamarin.Forms, есть ble устройство (Plugin.Ble), от которого раз в ~100мс приходит массив данных с сигналом. Этот сигнал после склейки с полученным ранее сигналом и некоторой обработки нужно отобразить в виде графика (использую для отображения Microcharts). Получение и обработка данных происходит в отдельном потоке. Выбрасывая детали обработки сигнала и все постороннее, выглядит следующим образом:
class Cache
{
// Singleton instances
static public Cache instance() {//...}
List<float> data = new List<float>();
int size;
Mutex mut = new Mutex();
public void addSample(List<float> sample)
{
mut.WaitOne();
data.AddRange(sample);
while (data.Count > size) data.RemoveAt(0);
mut.ReleaseMutex();
}
public List<float> getData()
{
mut.WaitOne();
var result = new List<float>(data);
mut.ReleaseMutex();
return result;
}
}
//----------------------------------------------------------------------
class BleModule
{
List<float> sample = new List<float>();
public async Task connect()
{
// some connection to characteristic
characteristic.ValueUpdated += (o, args) =>
{
// recieved bytes -> value
sample.Add(value);
if (sample.Count >= 500)
{
Cahce.instance().addSample(sample);
sample.Clear();
}
};
await characteristic.StartUpdatesAsync();
}
}
//----------------------------------------------------------------------
class ChartPage : ContentPage
{
ChartView chartView;
public ChartPage()
{
chartView.Chart = new LineChart();
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
{
Device.BeginInvokeOnMainThread(() =>
{
chart.Chart.Entries = Cache.instance().getData().Select(item => ()
{
return new ChartEntry(item);
});
});
return true;
});
}
}
Собственно, проблема заключается в том, что первые несколько секунд интерфейс откликается на различный ввод и при этом отрисовывает график и обновляет его. Затем всё хуже до тех пор, пока ввод вовсе не заблокируется и не перестанет обновляться график. Есть ли какие-то идеи, как это исправить?