Использование Thread.Sleep в Xamarin.Forms

Я хочу выполнить следующие

MainPage = new ContentPage
{
    Content = new StackLayout
    {
        Children =
        {
            new Button
            {
                Text = "Thread.Sleep",
                Command = new Command(() =>
                {
                    Thread.Sleep(1000);
                    MainPage.Animate("", x => MainPage.BackgroundColor = Color.FromRgb(x, x, x));
                }),
            },
            new Button
            {
                Text = "Task.Run + Thread.Sleep",
                Command = new Command(async () =>
                {
                    await Task.Run(() => Thread.Sleep(1000));
                    MainPage.Animate("", x => MainPage.BackgroundColor = Color.FromRgb(x, x, x));
                })
            },
            new Button
            {
                Text = "Device.StartTimer",
                Command = new Command(() => Device.StartTimer(
                    TimeSpan.FromSeconds(1),
                    () =>
                    {
                        MainPage.Animate("", x => MainPage.BackgroundColor = Color.FromRgb(x, x, x));
                        return false;
                    })),
            },
        }
    }
};

Я включил System.Threading и System.Threading.Tasks, но я все еще получаю

Имя "Thread" не существует в текущем контексте.

Этот сайт предполагает, что Thread.Sleep можно использовать в Xamarin.Forms. У меня это в общем проекте, а не в PCL.

Ответ 1

Если вы хотите подождать

асинхронно: await Task.Delay(10000);

синхронно: Task.Delay(10000).Wait();

Но, пожалуйста, постарайтесь не блокировать поток пользовательского интерфейса, чтобы обеспечить хороший пользовательский интерфейс и откликаться на ваше приложение.

Использование Thread.Sleep в Xamarin.Forms

Есть два шаблона Xamarin.Forms:

  • Библиотека портативных классов Xamarin.Forms

    Из-за механизма подмножества PCL у вас нет шансов получить Thread.Sleep.

    Обновление 2017: Теперь PCL устарели. Если вы используете .netstandard 2.0, вы можете использовать Thread.Sleep, как вы привыкли к нему.

  • Общий проект Xamarin.Forms

    Этот шаблон содержит разные платформы, которые не поддерживают Thread.Sleep. Windows UWP, Xamarin.Android и Xamarin.iOS поддерживают его, Windows Phone 8.1 и Windows 8.1 нет. Если вы выгрузите/удалите 2 проекта, решение будет построено. (не забудьте использовать System.Threading, в вашем App.cs)

Ответ 2

Вы можете попробовать использовать

await Task.Delay(milliseconds);

если вы хотите поместить задержку в свой поток.

Для блокировки вы можете сделать

Task.Delay(TimeSpan.FromSeconds(5)).Wait();