尝试动态更改标签文本时应用程序卡住

时间:2018-09-25 13:13:00

标签: c# xamarin xamarin.forms

我有以下代码,当页面加载时调用:

public StartPage()
{
    NavigationPage.SetHasNavigationBar(this, false);
    InitializeComponent();
    Task.Run(() =>
    {
        Scan_Function();
    });
}

Scan_Function()中,我有一个秒表和一堆if语句,它们应该使bleText标签的文本动态变化:

public void Scan_Function()
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    while (sw.Elapsed.TotalMilliseconds <= 10000)
    {   
        if (sw.Elapsed.TotalMilliseconds >= 1000 && sw.Elapsed.TotalMilliseconds <= 1050)
        {
                bleText.Text = "Scanning.";
        }
        else if (sw.Elapsed.TotalMilliseconds >= 2000 && sw.Elapsed.TotalMilliseconds <= 2050)
        {
                bleText.Text = "Scanning..";
        }
      ....... continues 
    }
        sw.Stop();
        bleText.Text = "Couldn't connect";
        bleText.TextColor = Color.Red;
}

我正在从Task.Run()调用我的Scan_Function(),因为我希望该方法与其他所有内容异步运行,以便用户仍然可以按按钮等。

我的问题是,什么都没发生!我怀疑bleText.Text出了点问题,导致调试器到达并似乎卡住了,而没有进行任何更新或跳出循环。 如果我评论我的if语句,它将在循环中运行,但是一旦到达循环外的bleText.Text就会卡住。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:2)

您无法从后台线程更新UI。使用BeginInvokeOnMainThread()强制您的代码在UI线程上执行

Device.BeginInvokeOnMainThread( () => {
    bleText.Text = "Couldn't connect";
    bleText.TextColor = Color.Red;
} );