我有一个已实现异步TCP / IP套接字的Form(Form1)。我有一个我创建的对象(公共类MyObject)。
从Form中,我创建了一个MyObjects数组。然后我调用MyObjects上的方法来操作数据。在MyObjects中我有一个函数:
private void send(string sPacketData)
{
if (SocketState.clientSocket != null && SocketState.clientSocket.Connected)
{
byte[] byteData = Encoding.ASCII.GetBytes(sPacket);
SocketState.clientSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(Form1.SendCallback), this);
}
}
这里的问题是我试图访问Form1的SendCallback函数而没有引用Form1。
以下是SendCallback的样子:
public void SendCallback(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
MyObject mo = (MyObject)ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = mo.SocketState.clientSocket.EndSend(ar);
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine("Send Callback: " + e.Message + "\r\n");
}
}
一种解决方案是将SendCallback设为静态,但这会导致异常,而不将其设置为对象的实例。
有不同的方法吗?我吠叫错了树吗?我应该从MyObjects的函数调用返回我想要发送的数据,然后从表单发送吗?
答案 0 :(得分:0)
让send
将回调视为其中一个参数,并让form1
将回调方法传递给send
。或者,您可以向MyClass
类型的AsyncCallback
添加属性,该属性由Form1
设置并在send
方法中使用。
在Form1
中创建回调以传递给MyObject
时使用this.SendCallback
而不是Form1.SendCallback
。或者,由于隐含了this
,只需加入SendCallback
。
委托不仅仅是对方法的引用,它是对应该调用它的方法和对象实例的引用(它更强大)。 (对于静态方法,对象将是null
。)幸运的是,您不需要显式地将引用传递给委托构造函数。当您输入this.SomeMethod
或someObject.MethodOfThatObject
时,编译器会将其转换为该实例上调用的该方法的委托。