Come ottenere l'atteso Thread.Sleep?


139

Sto scrivendo un'applicazione legata alla rete basata sul paradigma waitit / sleep.

A volte, si verificano errori di connessione e, nella mia esperienza, vale la pena attendere qualche istante e quindi riprovare a eseguire nuovamente l'operazione.

Il problema è che se uso Thread.Sleep o un'altra operazione di blocco simile in waitit / async, blocca tutte le attività nel thread del chiamante.

Cosa devo sostituire Thread.Sleep (10000) con per ottenere lo stesso effetto di

await Thread.SleepAsync(10000)

?

AGGIORNARE

Preferirò una risposta che lo fa senza creare alcun thread aggiuntivo

Risposte:


323

Le altre risposte che suggeriscono di iniziare una nuova discussione sono una cattiva idea - non è necessario farlo affatto. Parte del punto di async/ awaitè ridurre il numero di thread necessari per l'applicazione.

Dovresti invece utilizzare Task.Delayciò che non richiede un nuovo thread ed è stato progettato proprio per questo scopo:

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

Sto ancora affrontando le cose a4.5. Dov'è il ramo di esecuzione sul codice dopo quella dichiarazione? La parte non dormiente / bloccante la esegue o il "thread" che attende? L'esecuzione principale non bloccante lascia semplicemente il blocco seguente (aka return)?
Kenny,

1
si. Questo è ESATTAMENTE ciò di cui ho bisogno
Arsen Zahray il

1
@kenny: potresti trovare utile la mia asyncintroduzione . Quando l'attesa restituita da Task.Delayviene modificata await, poiché non è completa, il metodo corrente restituisce un'attività incompleta. Successivamente, quando il Delaycompletamento (fuori da un timer, non da un thread), il resto del metodo è programmato per l'esecuzione. La continuazione si svolge in un "contesto" che può tornare allo stesso thread originale - dettagli sul mio blog.
Stephen Cleary,

@StephenCleary grazie per quello. Quindi ho ragione nel dire che il codice after wait è "programmato" per l'esecuzione e il thread chiamante ritorna?
Kenny,

2
Sì, il thread chiamante restituisce (immediatamente) e il codice dopo che awaitè stato pianificato (eventualmente).
Stephen Cleary,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.