Как реализовать многопоточность в Xamarin.Android?

Я пытаюсь отправить / опубликовать на 100 мс, и сообщение выглядит так: хххххххххх Так что каждые 100 мс или около того подписка будет вызываться. Моя проблема в том, что я думаю, что это недостаточно быстро (т. Е. Если текущая подписка еще не завершена и вызывается другая подписка / публикуется сообщение)

Я думал о том, как мне продолжать заполнять список одновременно графиком с Оксиплотом. Могу ли я использовать потоки для этого?

var x = 0;
channel.Subscribe(message =>
            {
                this.RunOnUiThread(() =>
                {

                    var sample =  message.Data;
                    byte[] data = (byte[])sample;
                    var data1 = System.Text.Encoding.ASCII.GetString(data);
                    var splitData = data1.Split('-');
                    foreach(string s in splitData) //Contains 10
                    {
                        double y = double.Parse(s);
                        y /= 100;
                        series1.Points.Add(new DataPoint(x, y));
                        MyModel.InvalidatePlot(true);
                        x++;
                    }
                    if (x >= xaxis.Maximum)
                    {
                        xaxis.Pan(xaxis.Transform(-1 + xaxis.Offset));
                    }


                });
            });

1 ответ

Гарантия минимального времени выполнения входит в Программирование в реальном времени. А с приложением для ОС для смартфонов вы настолько далеки от того, что я могу себе представить. Единственное, что будет дальше, - это любой интерпретируемый язык (PHP, Python).

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

integer interval = 20;
DateTime dueTime = DateTime.Now.AddMillisconds(interval);

while(true){
  if(DateTime.Now >= dueTime){
    //insert code here

    //Update next dueTime
    dueTime = DateTime.Now.AddMillisconds(interval);
  }
  else{
    //Just yield to not tax out the CPU
    Thread.Sleep(1);
  }
}

Обратите внимание, что DateTime.Now перезапускает что-то новое каждые 18 мс, поэтому все, что меньше 20, будет слишком мало.

Если вы считаете, что не можете позволить себе минимальное время, вам может понадобиться прочитать Speed ​​Rant.

Другие вопросы по тегам