È brutto avere un codice costoso all'inizio di un metodo asincrono, prima che venga chiamato il primo await
? Questo codice dovrebbe essere incapsulato con un TaskEx.Run
?I metodi asincroni possono avere un codice costoso prima del 'attendere'?
risposta
Come dice Reed, dipende molto dal contesto. Il codice deve essere eseguito a un po 'di punto ma, a seconda del contesto, potrebbe finire per essere eseguito su un thread pool di thread invece di uno critico.
Piuttosto che usare Task.Run
, userei TaskEx.Yield
:
public async Task Foo()
{
await TaskEx.Yield();
// Do expensive stuff
}
Per quanto ne sono a conoscenza, che è fondamentalmente un modo di ritornare immediatamente al chiamante, ma permettendo al resto del metodo asincrono a essere programmato subito Se ti trovi in una specie di thread dell'interfaccia utente di Windows Form, non c'è motivo di farlo mentre tornerai al thread dell'interfaccia utente (e eseguirai subito un codice costoso) - ma avrebbe senso se ti trovassi in un contesto dove il thread corrente non deve essere bloccato, ma le continuazioni vengono eseguite su un altro thread.
Non è necessariamente negativo, ma può avere conseguenze impreviste. Se il chiamante si aspetta che il codice si comporti in modo completamente asincrono, il codice costoso verrà eseguito in modo sincrono. Questo farà sì che si comporti in parte come un metodo sincrono, ma anche in modo asincrono, che è il peggiore dei due mondi (complessità extra da asincronia senza il repsoniveness ...)
Se possibile, vorrei raccomandare di provare ad avere come un codice poco costoso che porta alla prima attesa. Utilizzare Task.Run
(o nel CTP) per racchiudere il costoso codice o spostare il costoso codice nel proprio metodo asincrono (su cui si potrebbe await
) sarebbe utile in questo caso.
- 1. Copertura del codice per i metodi asincroni
- 2. Scaricare più file asincroni e attendere che tutti terminino prima di eseguire il resto del codice
- 3. Interfacce e metodi asincroni
- 4. I moduli possono avere proprietà?
- 5. I metodi asincroni dell'applicazione Mvc sono sospesi
- 6. Come funzionano i metodi asincroni in C#?
- 7. metodi asincroni restituiscono null
- 8. Attendi che i metodi asincroni finiscano in un ciclo for
- 9. XmlWriter metodi asincroni
- 10. Perché i metodi asincroni non aspettati non generano eccezioni?
- 11. Quali eventi del ciclo di vita ASP.NET possono essere asincroni?
- 12. Metodi asincroni in NSOperation
- 13. Come rendere i metodi asincroni che utilizzano un thread safe code
- 14. I semplici oggetti Javascript possono avere eventi?
- 15. metodi asincroni in istruzione using
- 16. Perché i metodi parziali possono avere solo un tipo di reso vuoto?
- 17. Web di Azure - Posso utilizzare i metodi asincroni?
- 18. È possibile attendere attività asincrone durante un clic del pulsante?
- 19. Codice EF Primo: metodi che possono tradurre in SQL
- 20. Perché i tipi generici non possono avere un layout esplicito?
- 21. I metodi web possono essere sovraccaricati?
- 22. I metodi statici di PHP possono avere legalmente una visibilità protetta o privata?
- 23. Come scrivere correttamente Parallel.Per metodi asincroni
- 24. Come si chiamano i metodi asincroni in asp.net C# 4.0?
- 25. I metodi signalr sul lato server dovrebbero essere asincroni quando si chiamano i client?
- 26. Come documentare le eccezioni dei metodi asincroni?
- 27. test EF metodi asincroni con i metodi di sincronizzazione con MOQ
- 28. Come attendere il completamento del thread prima di continuare?
- 29. creare attività asincroni e attendere che tutti loro di completare
- 30. I metodi Java possono restituire il tipo Enum?
Si può pseudo codificare un esempio? – vcsjones