Je veux exécuter ce qui suit
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;
})),
},
}
}
};
J'ai inclus System.Threading
et System.Threading.Tasks
, mais je reçois toujours
Le nom "Thread" n'existe pas dans le contexte actuel.
Ce site suggère que Thread.Sleep
peut être utilisé dans Xamarin.Forms
. J'ai ceci dans un projet partagé, pas un PCL.
Si vous voulez attendre
de manière asynchrone: await Task.Delay(10000);
de façon synchrone: Task.Delay(10000).Wait();
Mais essayez d'éviter de bloquer le thread d'interface utilisateur pour assurer une bonne expérience utilisateur et garder votre application réactive.
tilisation de Thread.Sleep dans Xamarin.Forms
Il existe deux modèles Xamarin.Forms:
Bibliothèque de classes portable Xamarin.Forms
En raison du mécanisme de sous-ensemble PCL, vous n'avez aucune chance d'obtenir Thread.Sleep
.
Mise à jour 2017: Les PCL sont désormais obsolètes. Si vous utilisez .netstandard 2.0, vous pouvez utiliser Thread.Sleep
comme vous en avez l'habitude.
Projet partagé Xamarin.Forms
Ce modèle contient différentes plates-formes qui ne prennent pas en charge Thread.Sleep
. Windows UWP, Xamarin.Android et Xamarin.iOS le prennent en charge, Windows Phone 8.1 et Windows 8.1 non. Si vous déchargez/supprimez les 2 projets, la solution se construit. (n'oubliez pas d'utiliser System.Threading; dans votre App.cs)
Vous pouvez essayer d'utiliser
await Task.Delay(milliseconds);
si vous voulez mettre un délai dans votre fil.
Pour le blocage, vous pouvez le faire
Task.Delay(TimeSpan.FromSeconds(5)).Wait();