如何在 Xamarin android 和 ios 中休眠线程?

How to sleep thread in Xamarin android and ios?

我正在使用 Xamarin cross 平台为 iOS 和 Android 构建应用程序。我有一个名为 "Core" 的项目,然后一个用于 iOS,一个用于 Android。

在共享的 "Core" 项目中,我想展示我制作的加载动画,同时从设备获取当前位置。我可以获取我的 locationWatcher,启动它,然后直接调用 LocationWatcher.CurrentPosition,但是由于它刚刚开始监视位置更新,所以还没有时间获取任何位置。

我的解决方案是启动后等待2秒,然后获取位置。但是我不想异步等待,我希望 UI 在等待时被锁定。这是因为在当前 pos 状态 os 已知之前,用户不能做任何事情。

我目前通过循环来实现:

DateTime startTime = DateTime.Now();
while ( (DateTime.Now() - startTime).TotalMilliseconds() < 2000) {
    //Locking the UI here, but it's what I want so it's ok.
}

对于在 Java 中只是 "Thread.sleep(2000)"

的东西来说,这似乎是一个丑陋的 'hack'

有更好的方法吗?

阻塞 UI 线程是一种不好的做法,因为除其他外,它可能会导致设备将应用程序标记为 "not responding"。你也不能保证位置会在两秒钟内确定,所以在最好的情况下你的建议只是部分修复。

你真正想要做的是通过禁用提供输入的可能性来阻止 UI 输入(应该有禁用你的 UI 元素的方法)然后看看是否有当确定您的位置时从地理定位服务回调。在回调中,重新启用 UI 元素。如果不存在这样的回调,则在 UI 线程上与 RunOnUIThread/InvokeOnMainThread 同步执行位置查找,这样线程只会阻塞到 returns.

如果你想继续你的解决方案,

RunOnUiThread(() => Thread.Sleep(2000));

应该可以解决问题,但我真的建议不要这样做。在 iOS,你必须做

InvokeOnMainThread(() => Thread.Sleep(2000));

使用 Xamarin Forms 的多平台方式是

await Task.Delay(ms);

编辑:

读完你真的想阻塞主线程这里是阻塞线程的多平台方法:

Task.Delay(ms).Wait()