2012-08-22 52 views
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"); 
     } 
    } 

一種解決方案是使SendCallback靜態的,但是這將導致在未設置爲一個對象的實例例外。

有沒有不同的方法來做到這一點?我吠叫錯了樹嗎?我應該返回我想從MyObjects函數調用發送的數據,然後從Form發送數據嗎?

+0

我建議將回調作爲MyObject的一種方法,因爲它與該對象有關,並使其不在UI代碼中 – Jetti

回答

0

剛剛有send將回調作爲它的一個參數,並且form1將回調方法傳遞給send。或者,您可以將一個屬性添加到MyClass,其類型AsyncCallbackForm1設置,並在send方法中使用。

當在Form1中創建回調傳遞給MyObject時,使用this.SendCallback而不是Form1.SendCallback。或者,由於暗示this,只需放入SendCallback

委託不僅僅是對方法的引用,它是對應該調用它的方法和對象實例的引用(它更強大)。 (對於靜態方法,該對象將爲null)。幸運的是,您不需要將引用明確地傳遞給委託構造函數。當您輸入this.SomeMethodsomeObject.MethodOfThatObject時,編譯器會將其轉換爲該實例上調用的該方法的委託。

+0

SendCallback存在於Form1中。 Send函數在MyObject中。因此,this.SendCallback在MyObject中不存在。 – Mausimo

+0

@Mausimo據此編輯。 – Servy

+0

這個問題,MyObject.SomeFunction()被調用。 SomeFunction()會運行一堆調用其他函數的邏輯,最終可以進入Send()函數。我將不得不通過許多函數來傳遞迴調函數,這並不理想。我可以使回調屬性MyObject或somthing?然後在創建對象時進行設置。 – Mausimo