Дедлок 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;
        });
    }
}

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


Ответы (0 шт):