0

我有一个实现异步 TCP/IP 套接字的表单 (Form1)。我有一个我创建的对象(公共类 MyObject)。

从表单中,我创建了一个 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 的函数调用发送的数据,然后从表单发送吗?

4

1 回答 1

0

只需send将回调作为其参数之一,并将form1回调方法传递给send. 或者,您可以添加一个由该方法设置并在该方法中使用MyClass的类型的属性。AsyncCallbackForm1send

在创建回调时Form1传递给MyObjectusethis.SendCallback而不是Form1.SendCallback. 或者,既然this是隐含的,就输入SendCallback.

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

于 2012-08-22T19:51:51.490 回答