如何从对象中调用主窗体中的Socket Send方法?异步套接字

时间:2012-08-22 19:46:26

标签: c# winforms sockets

我有一个已实现异步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的函数调用返回我想要发送的数据,然后从表单发送吗?

1 个答案:

答案 0 :(得分:0)

send将回调视为其中一个参数,并让form1将回调方法传递给send。或者,您可以向MyClass类型的AsyncCallback添加属性,该属性由Form1设置并在send方法中使用。

Form1中创建回调以传递给MyObject时使用this.SendCallback而不是Form1.SendCallback。或者,由于隐含了this,只需加入SendCallback

委托不仅仅是对方法的引用,它是对应该调用它的方法和对象实例的引用(它更强大)。 (对于静态方法,对象将是null。)幸运的是,您不需要显式地将引用传递给委托构造函数。当您输入this.SomeMethodsomeObject.MethodOfThatObject时,编译器会将其转换为该实例上调用的该方法的委托。