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 を参照せずに Form1 の SendCallback 関数にアクセスしようとしていることです。

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");
        }
    }

1 つの解決策は、SendCallback を静的にすることですが、これにより、オブジェクトのインスタンスに設定されていない例外が発生します。

これを行う別の方法はありますか?私は間違った木を吠えていますか?MyObjects の関数呼び出しから送信したいデータを返してから、フォームから送信する必要がありますか?

4

1 に答える 1

0

sendパラメータの 1 つとしてコールバックを取得し、コールform1バック メソッドを に渡しますsend。または、メソッドによって設定され、メソッドで使用されるMyClassタイプのプロパティを追加することもできます。AsyncCallbackForm1send

でコールバックを作成するときは、ではなく使用するForm1ために渡します。または、が暗示されているので、そのまま入れます。MyObjectthis.SendCallbackForm1.SendCallbackthisSendCallback

デリゲートは単なるメソッドへの参照ではなく、メソッドとそれを呼び出すオブジェクト インスタンスへの参照です (これははるかに強力です)。(オブジェクトはnull静的メソッド用になります。) さいわい、デリゲート コンストラクターへの参照を明示的に渡す必要はありません。入力するthis.SomeMethodsomeObject.MethodOfThatObject、コンパイラはそれをそのインスタンスで呼び出されたそのメソッドへのデリゲートに変換します。

于 2012-08-22T19:51:51.490 に答える