Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当尝试动态更改标签文本时,应用程序被卡住_C#_Xamarin_Xamarin.forms - Fatal编程技术网

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在非异步方法中不可能等待