将参数传递给AsyncCallback函数?

13

我正在学习socket编程,我有以下函数:

public void OnDataReceived(IAsyncResult asyn)

这是回调函数的设置方式:

pfnWorkerCallBack = new AsyncCallback(OnDataReceived);

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


异步委托编程示例 - sll
4个回答

10

我假设您在这里使用System.Net.Sockets.Socket。 如果查看BeginReceive的重载,您会看到object参数(命名为state)。 您可以将任意值作为此参数传递,它将流经到您的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
}

@user1192403 很高兴听到这个好消息 :) - MrMDavidson
1
如果我们要传递多个参数怎么办? - Vahid Ghadiri
2
然后你需要使用某种容器来存储它;public class Foo { public int Bar {get;set;} public string Baz {get;set;} }然后将该实例传递到 BeginReceive 方法中,并将 result.AsyncState 强制转换回该类型。 - MrMDavidson

4

我更喜欢使用匿名委托来解决这个问题:

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
当您调用BeginReceive时,您可以将任何object作为其最后一个参数传递。通过IAsyncResultAsyncState属性,相同的对象将可用于您的回调函数。请注意保留HTML标签格式。

0
正如MrMDavidson所提到的。
如果你查看BeginReceive的重载方法,你会看到有一个名为state的对象参数。
你可以将一个包含你所需参数的对象数组传递给state参数,然后在回调方法中处理它们。
client.BeginConnect(ipEndPoint, new AsyncCallback(ConnectedCallback), new object[] { parameter1, parameter2});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接