211 votes

Comment obtenir un Thread.Sleep attendu ?

J'écris une application liée au réseau basée sur le paradigme await/sleep.

Parfois, des erreurs de connexion se produisent et, d'après mon expérience, il est utile d'attendre un certain temps, puis de réessayer l'opération.

Le problème est que si j'utilise Thread.Sleep ou une autre opération de blocage similaire dans await/async, cela bloque toute activité dans le thread appelant.

Par quoi devrais-je remplacer Thread.Sleep(10000) pour obtenir le même effet que

await Thread.SleepAsync(10000)

?

UPDATE

Je préférerais une réponse qui fait cela sans créer de fil supplémentaire.

468voto

Jon Skeet Points 692016

Les autres réponses suggérant de créer un nouveau fil de discussion sont une mauvaise idée - ce n'est pas du tout nécessaire. Une partie de l'objectif de async / await est de réduire le site le nombre de threads dont votre application a besoin.

Vous devriez plutôt utiliser Task.Delay dont n'a pas nécessitent un nouveau fil, et a été conçu précisément dans ce but :

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);

Cette solution présente également l'avantage de permettre l'annulation si un jeton d'annulation est fourni. Exemple :

public async Task DoWork(CancellationToken token)
{
    await Task.Delay(1000, token);
}

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