Xamarin Forms - приложение, называемое интерфейсом, предназначенным для другого потока - PullRequest
0 голосов
/ 02 мая 2018

сейчас я пытаюсь работать с формами Xamarin в сочетании с устройствами 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
    }

Так, как я могу решить проблему? Я очень признателен за помощь!

1 Ответ

0 голосов
/ 02 мая 2018

Событие Elapsed System.Threading.Thread.Timer запускается в потоке пула потоков, которому не принадлежит ACD0 (который, как я полагаю, является интерфейсом для этого устройства). Вместо этого вы должны использовать Таймер форм Xamarin :

1007 * Threading * Любой код, запускаемый в таймере, будет выполняться в основном потоке пользовательского интерфейса. Убедитесь, что вы не блокируете поток пользовательского интерфейса и не выполняете интенсивные вычисления. Убедитесь, что вы переместили код в фоновый поток, если это необходимо.

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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...