Как реализовать многопоточность в 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.