2011-12-18 11 views
6

Sto riscontrando un po 'di problemi nel comprendere che la chiamata al metodo BeginInvoke() in un delegato quando chiama in modo asincrono i metodi, dopo il completamento dei suoi compiti, perché BeginInvoke() non può restituire il valore restituito dal metodo, perché richiediamo EndInvoke() per interrogare BeginInvoke() e restituire il valore di ritorno da esso. So che questo può non essere una buona domanda, ma la mia confusione è reale :-)perché è necessario che EndInvoke() restituisca il valore della chiamata asincrona in delegato?

Aggiunta: posso chiamare un metodo in modo asincrono utilizzando DelagateName.BeginInvoke (parametri), ora quando il metodo di corrispondenza nel delegato (supponiamo che restituisce un valore) termina il suo lavoro e restituisce un valore, perché ho bisogno di DelegateName.EndInvoke() per ottenere il valore restituito? perché la prima chiamata non può restituire valore sul completamento del metodo.

risposta

8

Quando BeginInvoke restituisce, il metodo non è terminato - questo è il punto in cui è asincrono. Quindi, BeginInvoke può solo darti un token che rappresenta la "promessa" di un risultato a un certo punto - e usi quella promessa per ottenere il risultato effettivo usando EndInvoke, di solito in un callback.

In .NET 4 questo è più piacevolmente incapsulato utilizzando Task e Task<T> ovviamente, ma i generici non facevano parte di .NET 1, quindi l'approccio un po 'più contorto per i delegati.

+0

Grazie Jon, questo risolve davvero la mia domanda :-), credo che nella lingua di un laico BeginInvoke è fatto per ottenere la chiamata e restituito il controllo con la promessa di prendersi cura del lavoro, quindi non può più fare alcun lavoro di ritorno , quindi EndInvoke() sarà necessario per fare quel lavoro più tardi ... (Credo che stia pensando giusto!) – mohits00691

+0

@ mohits00691: Non proprio come lo esprimerei, ma penso che tu abbia avuto l'idea giusta :) –

+0

Grazie Jon, mi ha aiutato molto a chiarire questo dubbio, credo che con il tempo continuerò a tuffarmi sempre di più, grazie mille a tutti. – mohits00691

8

È necessario solo il BeginInvoke e corrispondente a EndInvoke se si desidera chiamare il delegato in modo asincrono, vale a dire che non bloccherà il thread corrente. Ciò è utile per metodi o metodi a esecuzione prolungata che chiamano processi che non controlli, ad es. oltre i confini dell'applicazione.

Da ciò che descrivi potresti star meglio usando il metodo Invoke che restituirà il valore all'interno dello stesso metodo e sullo stesso thread, cioè in modo sincrono. Naturalmente il tuo thread potrebbe essere bloccato da un lungo processo in esecuzione in questa istanza. Dipende da cosa stai provando a fare.

Problemi correlati