2012-02-08 22 views
8

Estoy aprendiendo la programación del zócalo y tengo la siguiente función:¿Pasa el argumento a la función AsyncCallback?

public void OnDataReceived(IAsyncResult asyn) 

y así es como la devolución de llamada se establece:

pfnWorkerCallBack = new AsyncCallback(OnDataReceived); 

El problema es que necesito para pasar a otro argumento para OnDataReceived devolución de llamada función, ¿cómo puedo hacer esto? Intento crear un servidor tcp simple y necesito rastrear de qué cliente provienen los datos. ¿Algun consejo? ¡Gracias!

+0

[Muestra de programación de delegados asíncronos] (http://msdn.microsoft.com/en-us/library/h80ttd5f.aspx) – sll

Respuesta

7

Voy a suponer que estás usando System.Net.Sockets.Socket aquí. Si observa las sobrecargas de BeginReceive, verá el parámetro object (estado con nombre). Puede pasar un valor arbitrario como este parámetro y fluirá a su llamada AsyncCallback. A continuación, puede acceder utilizando la propiedad AsyncState del objeto IAsyncResult pasado a su devolución de llamada. P.ej;

public void SomeMethod() { 
    int myImportantVariable = 5; 
    System.Net.Sockets.Socket s; 
    s.BeginReceive(buffer, offset, size, SocketFlags.None, new new AsyncCallback(OnDataReceived), myImportantVariable); 
} 

private void OnDataReceived(IAsyncResult result) { 
    Console.WriteLine("My Important Variable was: {0}", result.AsyncState); // Prints 5 
} 
+0

¡Gracias, eso resolvió mi problema! – user1192403

+0

@ user1192403 Me alegra escucharlo :) – MrMDavidson

+0

¿Qué pasa si vamos a pasar parámetros múltiples? –

2

Cuando se llama a BeginReceive, puede pasar cualquier object como su último parámetro. El mismo objeto estará disponible para su devolución de llamada a través de la propiedad IAsyncResultAsyncState.

3

Este es un problema que prefiero resolver con los delegados anónimos:

var someDataIdLikeToKeep = new object(); 
mySocket.BeginBlaBla(some, other, ar => { 
     mySocket.EndBlaBla(ar); 
     CallSomeFunc(someDataIdLikeToKeep); 
    }, null) //no longer passing state as we captured what we need in callback closure 

Se evita así tener que lanzar un objeto de estado en la función receptora.

Cuestiones relacionadas