2012-02-08 13 views
8

uczę programowanie gniazd i mam następującą funkcję:Przekaż argument do funkcji AsyncCallback?

public void OnDataReceived(IAsyncResult asyn) 

i to, w jaki sposób zwrotna zostanie ustawiony:

pfnWorkerCallBack = new AsyncCallback(OnDataReceived); 

Problemem jest to, że trzeba przejść kolejny argument do OnDataReceived zwrotnego funkcja, jak mogę to zrobić? Próbuję utworzyć prosty serwer TCP i muszę śledzić, od którego klienta pochodzą dane. Jakieś wskazówki? Dzięki!

+0

[Asynchronous Delegates - Programming Sample] (http://msdn.microsoft.com/en-us/library/h80ttd5f.aspx) – sll

Odpowiedz

7

Zamierzam założyć, że używasz tutaj System.Net.Sockets.Socket tutaj. Jeśli spojrzysz na przeciążenia BeginReceive zobaczysz parametr object (stan nazwany). Możesz przekazać dowolną wartość jako ten parametr i przejdzie ona do twojego oddzwonienia na numer AsyncCallback. Następnie można go uzyskać, używając obiektu AsyncState obiektu IAsyncResult przekazanego do wywołania zwrotnego. Na przykład;

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

Dziękuję, że rozwiązałem mój problem !! – user1192403

+0

@ user1192403 Miło to słyszeć :) – MrMDavidson

+0

Co się stanie, jeśli przejdziemy przez wiele parametrów? –

2

Po wywołaniu BeginReceive można przekazać wszelkie object jako ostatni parametr. Ten sam obiekt zostanie udostępniony twojemu wywołującemu zwrotowi poprzez właściwość IAsyncResult 'AsyncState.

3

Jest to problem wolę rozwiązania z anonimowych delegatów:

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 

oszczędza konieczności rzucić obiekt stanu w funkcji przyjmującej.

Powiązane problemy