Ho letto opinioni contrastanti sul fatto che a ogni BeginInvoke() debba corrispondere un EndInvoke(). Ci sono perdite o altri problemi associati a NOT che chiama EndInvoke()?EndInvoke() è facoltativo, di tipo facoltativo o sicuramente non facoltativo?
risposta
Delegate.EndInvoke è documentato come avrai chiamano questo (cioè necessario - perdite altro accada) - da msdn:
Nota importante
Indipendentemente dalla tecnica utilizzata, chiama sempre EndInvoke per completare il c asincrono c tutti.
Control.EndInvoke è OK per ignorare per il fuoco-e-dimentica metodi - da msdn:
È possibile chiamare EndInvoke per recuperare il valore di ritorno dal delegato, se neccesary, ma questo non è richiesto.
Tuttavia - se si utilizza Delegate.BeginInvoke
e non si desidera che il risultato, è consigliabile utilizzare ThreadPool.QueueUserWorkItem
invece - vi rendono la vita molto più facile, e di evitare il dolore di IAsyncResult
ecc
Grazie a Marc, questo è ciò che ha motivato la domanda: stavo guardando attraverso Richter e ho notato QueueUserWorkItem, e ho pensato "aspetta, perché sto usando BeginInvoke/EndInvoke altrove". – endian
@endian - infatti: la maggior parte dell'utilizzo di BeginInvoke può essere fatto più semplicemente con ThreadPool; il BeginInvoke è forse utile per fare alcune cose e riunirle di nuovo in seguito ... –
Illuminato. Grazie! – rpattabi
EndInvoke non è facoltativo.
Maggiori informazioni here
Grazie Luca - risposta accettata. – endian
... per i delegati, almeno ;-p –
dal tuo collegamento: "L'unica eccezione documentata alla regola di cui sono a conoscenza è in Windows Form, in cui ti è ufficialmente permesso di chiamare Control.BeginInvoke senza preoccuparti di chiama Control.EndInvoke. " – Avram
e call EndInvoke non è una chiamata opzionale, è una parte del contratto. Se chiami BeginInvoke, devi chiamare EndInvoke.
Classico esempio del motivo per cui è necessario. È molto probabile che IAsyncResult restituito da BeginInvoke abbia assegnato risorse ad esso associate. Più comunemente un WaitHandle di sorta. Poiché IAsyncResult non implementa IDisposable, è necessario scegliere un altro posto per liberare le risorse. L'unico posto per farlo è EndInvoke.
Discuto brevemente di questo problema nel seguente post del blog.
http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx
Grazie Jared, molto apprezzato. – endian
EndInvoke non è un optional, perché è il luogo in cui vengono generate eccezioni se qualcosa è andato storto nella lavorazione asincrono.
In ogni caso non ci dovrebbero essere perdite perché se IAsyncResult è in possesso di qualche risorsa nativa dovrebbe implementare correttamente IDisposable e disporre tali risorse quando il GC chiama il suo finalizzatore.
È l'unico optional se non ti dispiace che la memoria del tuo programma cresca molto. Il problema è che il GC trattiene tutti i riferimenti nel tuo thread, perché potresti voler chiamare EndInvoke ad un certo punto. Vorrei andare con la risposta di Marc, il threadpool renderà la vita più facile. Tuttavia, è necessario prestare attenzione se si generano i thread dai thread, in quanto è limitato dal numero di thread che può far ruotare.
Non è opzionale perché chiamare BeginInvoke fa uso di WaitHandle che a sua volta utilizza un oggetto kernel che mantiene un conteggio per il numero di riferimenti necessari.La chiamata EndInvoke elimina con garbo l'handle che decrementa quel contatore sull'oggetto kernel e quando tale conteggio raggiunge lo zero, il gestore oggetti del kernel lo distruggerà.
Ogni risposta in questo post indica che EndInvoke() non è facoltativo. Tuttavia, ho trovato il seguente commento altamente classificato che è la risposta accettata su questo thread SO:
"Si noti che il team di Windows Form ha garantito che è possibile utilizzare Control.BeginInvoke in modo 'fire and forget' - cioè senza mai chiamare EndInvoke. Questo non è vero per le chiamate asincrone in generale: normalmente ogni BeginXXX dovrebbe avere una chiamata EndXXX corrispondente, solitamente nel callback. "
IMHO, è un peccato che 'Control.BeginInvoke' e' Delegate.BeginInvoke' condividano lo stesso nome, dato che hanno semantica totalmente diversa; a dire il vero, sono curioso di sapere perché i tipi delegati definiscono 'BeginInvoke' è un metodo di istanza, piuttosto che avere' Delegate.Bind (params) 'restituisce un' MethodInvoker' [delegato a zero argomenti] che invocherebbe il delegato con i parametri specificati e che potrebbero essere passati ad es un metodo 'ThreadPool.BeginInvoke'. – supercat
+1 per questa importante distinzione. L'onnisciente commento di Skeet (citato sopra) è molto rilevante per chi considera le situazioni Control.InvokeRequired. –
- 1. L'extern è facoltativo?
- 2. Determinare se Any.Type è facoltativo
- 3. Objective-C è richiesto @synthesize o facoltativo?
- 4. jQuery.Deferred() - l'operatore "nuovo" è facoltativo?
- 5. Facoltativo @PropertySource posizione
- 6. RavenDB - Facoltativo dove clausola
- 7. Rails facoltativo appartiene a
- 8. Parametro facoltativo nel cetriolo
- 9. Come si rende @Resource facoltativo?
- 10. Doxygen - dichiarare parametro come facoltativo
- 11. Argomento facoltativo seguito da Params
- 12. Come posso rendere log4net.dll facoltativo?
- 13. Argomento facoltativo nella macro cmake
- 14. Facoltativo [Richiesto] per tipi complessi
- 15. Argomento facoltativo prima in JavaScript
- 16. Il tag <tr> è facoltativo?
- 17. Come disattivare std :: experimental :: facoltativo?
- 18. L'argomento facoltativo non può essere cancellato?
- 19. Strano "Argomento non facoltativo" l'errore in VBA
- 20. Posso proiettare un riferimento facoltativo di un'entità in un riferimento facoltativo del tipo di risultato della proiezione?
- 21. System.MissingMethodException dopo l'aggiunta di un parametro facoltativo
- 22. PHP - Rendi facoltativo il parametro di riferimento?
- 23. Parametro facoltativo nel mezzo di un percorso
- 24. Attributo di espressione facoltativo nella direttiva AngularJS
- 25. SP con hash e facoltativo argomento scalare
- 26. Carattere facoltativo nella maschera di immissione
- 27. Utilizzo di CASE per un predicato facoltativo
- 28. Argomento facoltativo per ciascun argomento posizionale
- 29. XPath con elemento facoltativo nella gerarchia
- 30. E i parametri del tipo generico facoltativo in C# 5.0?
si potrebbe anche voler vedere: http://marcgravell.blogspot.com/2009/02/async-without-pain.html –