99 votes

Remplacement de Thread.Sleep dans .NET pour Windows Store

Thread.Sleep ne semble pas être prise en charge dans .NET pour les applications Windows Store.

Par exemple, cette

System.Threading.Thread.Sleep(1000);

compilera en ciblant n'importe quel Framework .NET (2.0, 3.5, 4.0, 4.5), mais pas en ciblant .NET pour les applications Windows Store (ou dans une bibliothèque de classe portable qui cible à la fois 4.5 et Store).

System.Threading.Thread est toujours là, mais il n'a pas la méthode Sleep.

J'ai besoin de retarder quelque chose pendant quelques secondes dans mon application, existe-t-il un remplacement approprié ?

EDIT pourquoi le délai est nécessaire : Mon application est un jeu et le délai est destiné à donner l'impression que l'ordinateur adverse "réfléchit" à son prochain mouvement. La méthode est déjà appelée de manière asynchrone (le thread principal n'est pas bloqué), je veux juste ralentir le temps de réponse.

2 votes

Étant donné que les applications Windows Store ne sont pas censées pouvoir figer l'interface utilisateur (tout est censé être asynchrone), il est logique qu'elles ne soient pas prises en charge.

2 votes

Avez-vous des événements ou le Monitor classe ? Vous pouvez utiliser le Wait avec un délai d'attente pour simuler une mise en veille.

0 votes

Est-ce que c'est pour Apptivate.ms ? :3

203voto

Jon Skeet Points 692016

Les applications du Windows Store adoptent l'asynchronie - et une "pause asynchrone" est fournie par Task.Delay . Ainsi, dans une méthode asynchrone, vous écrirez :

await Task.Delay(TimeSpan.FromSeconds(30));

... ou le délai que vous souhaitez. La méthode asynchrone se poursuivra 30 secondes plus tard, mais le thread pas être bloqué, tout comme pour tous les await expressions.

1 votes

Malheureusement, Task.Delay ne semble pas être supporté lorsqu'on cible .NET 4.5 + magasin + WP7 dans une bibliothèque de classes portables . Je suppose que je vais devoir déplacer cela dans les classes spécifiques à la plate-forme.

1 votes

@Max : Non, car il n'existait pas avant .NET 4.5. IIRC, WP7 lui-même n'a pas de support TPL. (Je peux me tromper...)

4 votes

Vous pouvez ajouter .RunSynchronously() si nécessaire.

46voto

Antony Thomas Points 891

Je déteste énoncer l'évidence mais au cas où quelqu'un voudrait une seule ligne System.Threading.Tasks.Task.Delay(3000).Wait()

20voto

Jasd Points 1627

Je viens de rencontrer le même problème et j'ai trouvé une autre solution intéressante que je voulais partager avec vous. Si vous voulez vraiment bloquer le fil de discussion, je le ferais comme ceci (merci @Brannon pour l'astuce "mince") :

// `waitHandle.Set` is never called, so we wait always until the timeout occurs
using (var waitHandle = new ManualResetEventSlim(initialState: false))
{
    waitHandle.Wait(TimeSpan.FromSeconds(5));
}

0 votes

C'est la meilleure réponse pour le codage portable.

0 votes

Utilisez la version "slim" de ceci.

11voto

Benny Neugebauer Points 5393

MainPage.xaml.cs

public MainPage()
{
  this.InitializeComponent();
  this.WaitForFiveSeconds();
}

private async void WaitForFiveSeconds()
{
  await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));
  // do something after 5 seconds!
}

-7voto

igrimpe Points 1503

Il n'y a pratiquement AUCUNE raison (sauf à des fins de test) d'utiliser JAMAIS Thread.Sleep() .

SI (et seulement si) vous avez une très bonne raison d'envoyer un thread en sommeil, vous pourriez vouloir vérifier que Task.Delay() que vous pouvez attendre pour "patienter" pendant une durée déterminée. Mais ce n'est jamais une bonne idée d'avoir un fil de discussion qui ne fait rien. C'est une mauvaise pratique...

9 votes

Je ne suis pas d'accord. Si le thread est un thread d'arrière-plan et que le sommeil est court, il est plus efficace de le faire dormir pendant quelques millisecondes que d'utiliser un timer.

1 votes

Et parfois, on vous dit de faire quelque chose en dépit du fait que vous avez informé la figure d'autorité des conséquences ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X