我有以下代码,当页面加载时调用:
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
就会卡住。
我在这里做什么错了?
答案 0 :(得分:2)
您无法从后台线程更新UI。使用BeginInvokeOnMainThread()
强制您的代码在UI线程上执行
Device.BeginInvokeOnMainThread( () => {
bleText.Text = "Couldn't connect";
bleText.TextColor = Color.Red;
} );