Передать аргумент в функцию AsyncCallback? - PullRequest
9 голосов
/ 08 февраля 2012

Я изучаю программирование сокетов, и у меня есть следующая функция:

public void OnDataReceived(IAsyncResult asyn)

и вот как устанавливается обратный вызов:

pfnWorkerCallBack = new AsyncCallback(OnDataReceived);

Проблема в том, что мне нужно пройтиеще один аргумент для функции обратного вызова OnDataReceived, как я могу это сделать?Я пытаюсь сделать простой TCP-сервер, и мне нужно отслеживать, с какого клиента поступают данные.Какие-нибудь советы?Спасибо!

Ответы [ 3 ]

8 голосов
/ 08 февраля 2012

Я собираюсь предположить, что вы используете System.Net.Sockets.Socket здесь. Если вы посмотрите на перегрузки BeginReceive , вы увидите параметр object (именованное состояние). В качестве этого параметра вы можете передать произвольное значение, и оно будет перенаправлено на ваш AsyncCallback обратный вызов. Затем вы можете получить к нему доступ, используя свойство AsyncState объекта IAsyncResult, переданного в ваш обратный вызов. Например,

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
}
3 голосов
/ 08 февраля 2012

Это проблема, которую я предпочитаю решать с анонимными делегатами:

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

Это избавляет от необходимости приведения объекта состояния в принимающую функцию.

2 голосов
/ 08 февраля 2012

Когда вы вызываете BeginReceive, вы можете передать любой object в качестве последнего параметра.Этот же объект будет доступен для вашего обратного вызова через свойство IAsyncResult AsyncState.

...