将参数传递给AsyncCallback函数

本文关键字:函数 AsyncCallback 参数传递 | 更新日期: 2023-09-27 18:23:50

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

public void OnDataReceived(IAsyncResult asyn)

回调就是这样设置的:

pfnWorkerCallBack = new AsyncCallback(OnDataReceived);

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

将参数传递给AsyncCallback函数

我假设您在这里使用的是System.Net.Sockets.Socket。如果查看BeginReceive的重载,您将看到object参数(命名状态)。您可以将任意值作为此参数传递,它将流到您的AsyncCallback回调中。然后,您可以使用传递到回调中的IAsyncResult对象的AsyncState属性访问它。例如;

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
}

这是我更喜欢用匿名委托解决的问题:

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

它省去了在接收函数中强制转换状态对象的麻烦。

当您调用BeginReceive时,您可以传递任何object作为其最后一个参数。相同的对象将通过IAsyncResultAsyncState属性提供给回调。

正如MDavidson先生所提到的。

如果你查看BeginReceive的过载,你会看到对象参数(命名状态)

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

client.BeginConnect(ipEndPoint, new AsyncCallback(ConnectedCallback), new object[] { parameter1, parameter2});