我正在学习套接字编程,并且具有以下功能:
public void OnDataReceived(IAsyncResult asyn)
这就是设置回调的方式:
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
问题是我需要将另一个参数传递给 OnDataReceived 回调函数,我该怎么做?我正在尝试制作一个简单的 tcp 服务器,我需要跟踪数据来自哪个客户端。有小费吗?谢谢!
我正在学习套接字编程,并且具有以下功能:
public void OnDataReceived(IAsyncResult asyn)
这就是设置回调的方式:
pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
问题是我需要将另一个参数传递给 OnDataReceived 回调函数,我该怎么做?我正在尝试制作一个简单的 tcp 服务器,我需要跟踪数据来自哪个客户端。有小费吗?谢谢!
我假设你在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
}
这是我更喜欢用匿名代表解决的问题:
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
,你可以传递 anyobject
作为它的最后一个参数。相同的对象将通过IAsyncResult
'AsyncState
属性提供给您的回调。
正如戴维森先生所说。
如果您查看重载,
BeginReceive
您会看到对象参数(命名状态)
您可以将所需参数的对象数组传递给state
参数,然后稍后在回调方法中处理它们。
client.BeginConnect(ipEndPoint, new AsyncCallback(ConnectedCallback), new object[] { parameter1, parameter2});