我正在学习套接字编程,我有以下功能:
public void OnDataReceived(IAsyncResult asyn)
这就是回调设置的方式:
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
问题是我需要将另一个参数传递给OnDataReceived回调函数,我该怎么做?我正在尝试创建一个简单的tcp服务器,我需要跟踪数据来自哪个客户端。有小费吗?谢谢!
答案 0 :(得分:8)
我打算假设你在这里使用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
}
答案 1 :(得分: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
它节省了必须在接收函数中转换状态对象。
答案 2 :(得分:2)
当您致电BeginReceive
时,您可以传递任何object
作为其最后一个参数。同一个对象将通过IAsyncResult
的{{1}}属性提供给您的回调。
答案 3 :(得分:0)
正如戴维森先生所说。
如果您查看
BeginReceive
的重载,则会看到对象参数(命名状态)
您可以将所需参数的对象数组传递给state
参数,然后稍后在回调方法中进行处理。
client.BeginConnect(ipEndPoint, new AsyncCallback(ConnectedCallback), new object[] { parameter1, parameter2});