12

我正在学习套接字编程,并且具有以下功能:

public void OnDataReceived(IAsyncResult asyn)

这就是设置回调的方式:

pfnWorkerCallBack = new AsyncCallback(OnDataReceived);

问题是我需要将另一个参数传递给 OnDataReceived 回调函数,我该怎么做?我正在尝试制作一个简单的 tcp 服务器,我需要跟踪数据来自哪个客户端。有小费吗?谢谢!

4

4 回答 4

10

我假设你在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
}
于 2012-02-08T11:46:33.690 回答
3

这是我更喜欢用匿名代表解决的问题:

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

它不必在接收函数中强制转换状态对象。

于 2012-02-08T11:52:51.693 回答
2

当你调用 时BeginReceive,你可以传递 anyobject作为它的最后一个参数。相同的对象将通过IAsyncResult'AsyncState属性提供给您的回调。

于 2012-02-08T11:48:22.873 回答
0

正如戴维森先生所说。

如果您查看重载,BeginReceive您会看到对象参数(命名状态)

您可以将所需参数的对象数组传递给state参数,然后稍后在回调方法中处理它们。

client.BeginConnect(ipEndPoint, new AsyncCallback(ConnectedCallback), new object[] { parameter1, parameter2});
于 2020-08-13T01:37:40.287 回答