猿问

Xamarin Forms-称为接口的应用程序已编组为不同的线程

现在,我正在尝试将Xamarin Forms与I2C设备和Raspberry Pi结合使用。我用C#编程,Raspberry Pi随Windows IoT一起安装。而且我遇到了有关计时器的问题。


我想要做的是创建一个System.Threading.Timer并从I2C设备读取数据,然后每秒将其显示在Label上,但是当我尝试显示数据时,错误显示“该应用程序调用了一个接口被编组为另一个线程。”


以下代码是我尝试执行的操作。


    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

    }

那我该如何解决这个问题呢?非常感谢您的帮助!


收到一只叮咚
浏览 139回答 1
1回答

海绵宝宝撒

一System.Threading.Thread.Timer的已用事件的线程池线程,它没有自己的ACD0(我假设是该设备的接口)运行。相反,您应该使用Xamarin Forms Timer:穿线在计时器中运行的任何代码都将在主UI线程上运行。确保您不阻塞UI线程或进行任何密集的计算。如果合适,请确保将代码移至后台线程。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");}
随时随地看视频慕课网APP
我要回答