2010-04-13 11 views
5

Considerami arrugginito in merito ai delegati asincroni.Il modo corretto per Fire-and-Forget un delegato asincrono

Se voglio chiamare un metodo in modo asincrono, in uno stile "fire-and-forget", è un modo appropriato per farlo?

Action action = DoSomething; 
action.BeginInvoke(action.EndInvoke, null); 

Il metodo DoSomething() cattura tutte le eccezioni e si occupa di loro internamente.

La chiamata a EndInvoke è appropriata? Necessario?

Esiste un modo più chiaro per ottenere lo stesso comportamento?

risposta

4

Il modo più "vecchia scuola" in .NET 3.5 è quello di utilizzare il ThreadPool:

ThreadPool.QueueUserWorkItem(s => DoSomething()); 

Se si preferisce utilizzare i delegati asincroni, quindi è necessario sapere che la chiamata a EndInvokeè necessaria, anche se non si dispone di alcun codice aggiuntivo che si desidera eseguire sulla richiamata.

+1

La tua linea batte i miei due. –

9

Il nuovo modo (in .NET 4) è quello di fare questo:

Task.Factory.StartNew(() => DoSomething()); 
+2

Che dire dello smaltimento dell'oggetto Task? Sarei interessato alla tua opinione su [questa domanda] (http://stackoverflow.com/q/3734280/119738) –

5

Si noti che Task.Factory.StartNew(() => DoSomething()); non riesce a osservare alcuna potenziale eccezione generata dal metodo DoSomething. So che questo è ciò che si desidera quando si avvia un'operazione di tipo "fire-and-forget", ma per quanto riguarda .Net 4, qualsiasi attività con un'eccezione non osservata finalizzata dal garbage collector si trasformerà in un'eccezione non gestita che ucciderà il processo . Tuttavia, in .Net 4.5, il comportamento predefinito è cambiato (vedi async & attendere le parole chiave).

Problemi correlati