2011-12-09 10 views

risposta

10

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.

5

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.

Problemi correlati