прямо сейчас я пытаюсь работать с Xamarin Forms в сочетании с устройствами I2C и Raspberry Pi. Я программировал на C#, а Raspberry Pi был установлен с Windows IoT. И у меня возникла проблема с таймером.
Я хотел создать System.Threading.Timer и читать данные с устройств I2C, а затем отображать их на метке каждую секунду, но когда я попытался отобразить данные, ошибка показала, что «Приложение вызвало интерфейс, который был организовано для другого потока ".
Следующий код - это то, что я пытался сделать.
public void InitSecondTimer(int interval)
{
secTimer = new Timer(interval);
secTimer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
secTimer.Start();
Debug.WriteLine("Secondtimer inited");
}
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
double voltage = 0;
InputI2C(ADC0, ref voltage); //Read data from I2C devices
ai0.Text = voltage.ToString(); //ai0 is a Label
}
Итак, как я могу решить проблему? Я очень признателен за помощь!
Событие Elapsed System.Threading.Thread.Timer
запускается в потоке пула потоков, которому не принадлежит ACD0 (который, как я предполагаю, является интерфейсом для этого устройства). Вместо этого вы должны использовать Таймер Xamarin Forms:
Threading
Any code run in a timer will run on the main UI Thread. Make sure you don’t block the UI thread or do any intensive calculations. Ensure you move the code to a background thread if appropriate.
public void InitSecondTimer(int interval)
{
Device.StartTimer(TimeSpan.FromMiliseconds(interval), () =>
{
double voltage = 0;
InputI2C(ADC0, ref voltage); //Read data from I2C devices
ai0.Text = voltage.ToString(); //ai0 is a Label
return true; // True = Repeat again, False = Stop the timer
});
Debug.WriteLine("Secondtimer inited");
}
Большое спасибо за быстрое и правильное решение, которое хорошо работает. Я очень благодарен вам за то, что вы сразу мне помогли и сэкономили мое время! Так круто!