c# - Xamarin iOS Sleep UI线程不起作用

标签 c# ios multithreading xamarin sleep

我的Xamarin iOS应用程序存在线程/ sleep 问题。我想创建一个简单的游戏,一种内存游戏。按下开始按钮时,将有4个按钮将更改其字体。从1开始,然后从2开始,依此类推。问题是我想在显示按钮的方法中暂停一下,因为用户需要几秒钟才能看到更改的颜色。我认为多线程直接 catch 了下一个任务,所以 sleep 不见了:(如何解决这个问题?谢谢!

代码:

    partial void btnStart (NSObject sender)
    {
        teller++;

        InvokeOnMainThread( ()=> { for (int i = 0; i < teller; i++) {
                String randomGetal = randomizer();
                Lijst.Add(new Opslag() {nummerGetal = teller, getal = randomGetal});
                ThreadPool.QueueUserWorkItem(o => InvokeOnMainThread(() => {ButtonColor(randomGetal);}));
        };
        });
        lblRandom1.Text = Lijst.Count.ToString();
    }

    public void ClearButton()
    {
        btnA.SetTitleColor (UIColor.Green, UIControlState.Normal);
        btnB.SetTitleColor (UIColor.Green, UIControlState.Normal);
        btnC.SetTitleColor (UIColor.Green, UIControlState.Normal);
        btnD.SetTitleColor (UIColor.Green, UIControlState.Normal);
    }

    public void ButtonColor(string a)
    {

        if (a == "A") {
            btnA.SetTitleColor (UIColor.Magenta, UIControlState.Normal);
            Thread.Sleep(2000);
            ClearButton ();
        }

        if (a == "B") {
            btnB.SetTitleColor (UIColor.Magenta, UIControlState.Normal);
            Thread.Sleep(2000);
            ClearButton ();
        }

        if (a == "C") {
            btnC.SetTitleColor (UIColor.Magenta, UIControlState.Normal);
            Thread.Sleep(2000);
            ClearButton ();
        }

        if (a == "D") {
            btnD.SetTitleColor (UIColor.Magenta, UIControlState.Normal);
            Thread.Sleep(2000);
            ClearButton ();
        }
    }

    public string randomizer()
    {
        int randomNummer = random.Next (0, 4);
        if (randomNummer == 0)
            return "A";
        if (randomNummer == 1)
            return "B";
        if (randomNummer == 2)
            return "C";
        if (randomNummer == 3)
            return "D";
        else
            return "Empty";
    }

}

public class Opslag
{
    public int nummerGetal {get;set;        
    }

    public string getal {
        get;
        set;
    }

}

}

最佳答案

我在Xamarin Android上也遇到了类似的问题。 Thread.Sleep()无法正常工作:
-都不来自System.Threading.Thread.Sleep()-也不来自Java.Lang.Thread.Sleep()
花了2小时试图解决问题。
找到above answer,但由于有点复杂,因此决定提炼核心问题。

解决方案

替换“基于线程”的 sleep ,如下所示:

DoSth() {
  Thread newThread = new Thread(new ThreadStart(DoWork));
  newThread.Start();
}

void DoWork() {
  Thread.Sleep(5000);
  // do sth after 5 secs
}

使用“基于异步”的方法:
DoSth() {
  DoWorkAsync();
}

async void DoWorkAsync() {
  await Task.Delay(5000);
  // do sth after 5 secs
}

顺便提一句。仅在应用启动后的开始阶段才会出现问题。

关于c# - Xamarin iOS Sleep UI线程不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22582714/

相关文章:

c# - 如何使用数据库优先 Entity Framework 更改表名

ios - NSString stringWithFormat较少的参数

c++ - boost::atomic 真的可以通过减少多线程系统调用(在互斥/信号量中)的开销来 boost 性能吗?

c# - 以编程方式单击 Windows 窗体应用程序中的网页按钮

c# - 过程或函数需要未提供的参数

c# - 从同一类型的另一个对象更新 Entity Framework 对象

android - 多人连接与玩游戏服务

ios - 双击内部有 contenteditable 的 div 和 iframe 禁用 div

c++ - 为什么线程在终止而不分离时让它们的堆栈保持不变?

java - 即使使用synchronized关键字,线程输出也不一致