C# 当尝试动态更改标签文本时,应用程序被卡住
我有以下代码,在加载页面时调用:C# 当尝试动态更改标签文本时,应用程序被卡住,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我有以下代码,在加载页面时调用: public StartPage() { NavigationPage.SetHasNavigationBar(this, false); InitializeComponent(); Task.Run(() => { Scan_Function(); }); } 在Scan_Function()中,我有一个秒表和一组if语句,它们应该使bleText标签的文本动态变化: public void S
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;
}
公共无效扫描函数()
{
秒表sw=新秒表();
sw.Start();
虽然(sw.appead.totalmillizes=1000&&sw.appead.totalmillizes=2000&&sw.appead.totalmillizes您不能从后台线程更新UI。请使用BeginInvokeOnMainThread()
强制代码在UI线程上执行
Device.BeginInvokeOnMainThread( () => {
bleText.Text = "Couldn't connect";
bleText.TextColor = Color.Red;
} );
无法从后台线程更新UI。请使用BeginInvokeOnMainThread()
强制在UI线程上执行代码
Device.BeginInvokeOnMainThread( () => {
bleText.Text = "Couldn't connect";
bleText.TextColor = Color.Red;
} );
为什么不使用计时器?秒表不是计时器,甚至不是“活动的”类。它在调用开始
时存储处理器刻度值,并在调用已用
时使用它计算持续时间。在任何情况下,您都无法从其他线程更新UI,无论操作系统如何。为什么不使用计时器的可能重复项?秒表
不是计时器,甚至不是“活动的”类。它在调用Start
时存储处理器刻度值,并在调用appeased
时使用它计算持续时间。在任何情况下,您都无法从其他线程更新UI,无论操作系统如何。谢谢!我是要将整个while循环封装在其中,还是只是为了标签而这样做?@JeppeChristensen为什么你不使用计时器吗?所有这些代码都应该删除。没有循环,没有阻塞任务,没有开始的任务。如果你真的想使用循环,请使用wait task.Delay()
,不是任务。run不可能在非异步方法中等待。谢谢!我是将整个while循环封装在此中,还是只为标签而做?@JeppeChristensen为什么不使用计时器?所有这些代码都应该删除。没有循环,没有阻塞任务,没有任务可以开始。如果确实要使用循环,请使用wait Task.Delay()
,而不是Task.run在非异步方法中不可能等待