2010-10-05 36 views
2

我創建了一個單線程Windows應用程序,它與超過100個套接字(使用AsyncCallbacks)進行通信,每秒可能會有5-10個套接字。在C#.NET 3.5中使用AsyncCallback問題

從.NET IDE啓動時,應用程序正常工作。如果從可執行文件啓動,應用程序似乎被吊死。在進一步的研究中,我發現應用程序在套接字上的通信非常好,只有UI上的數據沒有刷新。從套接字中讀取應用程序似乎太忙了,而不是刷新UI。

應用程序工作正常,用每個套接字的單獨線程替換AsyncCallback,但這似乎不是一個好方法。

我試圖創建消息隊列,但它沒有幫助。

我正確地說應用程序忙於讀取套接字而不是刷新UI?我該如何解決這個問題?

下面提到了用於AsynCallBack的代碼。

private void ConnectSocket() 
    { 
     IPEndPoint ipEnd = new IPEndPoint(_ip, _port); 
     m_socket = new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
     m_socket.Blocking = false; 
     m_socket.ReceiveBufferSize = RECEIVE_BUFFER_SIZE; 
     m_socket.NoDelay = true; 
     m_socket.LingerState = new LingerOption(false, 0); 

     AsyncCallback onconnect = new AsyncCallback(OnConnect); 
     m_socket.BeginConnect(ipEnd, onconnect, m_socket); 
    } 

    private void OnConnect(IAsyncResult ar) 
    { 
     Socket sock = (Socket)ar.AsyncState; 
     try 
     { 
      sock.EndConnect(ar); 
      if (sock.Connected) 
      { 
       SetupReceiveCallback(sock); 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    private void SetupReceiveCallback(Socket sock) 
    { 
     try 
     { 
      AsyncCallback receiveData = new AsyncCallback(ReceiveData); 
      sock.BeginReceive(receivedBuffer, 0, receivedBuffer.Length, 
       SocketFlags.None, receiveData, sock); 
     } 
     catch (SocketException ex) 
     { 
     } 
     catch (Exception ex) 
     { 
     } 
    } 

    private void ReceiveData(IAsyncResult ar) 
    { 
     Socket sock = (Socket)ar.AsyncState; 
     try 
     { 
      int numBytesReceived = sock.EndReceive(ar); 

      if (numBytesReceived > 0) 
      { 
       if (OnReceivedData != null) 
       { 
        OnReceivedData(receivedBuffer); 
       } 
      } 
      SetupReceiveCallback(sock); 
     } 
     catch (SocketException ex) 
     { 
      //If error code is 1054 then socket connection is terminated from the client. 
     } 
     catch (Exception ex) 
     { 
     } 
    } 
+0

我們需要看一些代碼。 – 2010-10-05 15:08:07

回答

1

這將是很奇怪的應用程序是忙凍結起來。什麼叫ConnectSocket()功能?如果在UI事件中調用它(例如,按下按鈕時),那麼它將在UI線程上執行,並且UI將鎖定,直到完成。如果您希望您的UI繼續工作,您將需要在後臺啓動一個單獨的線程來處理連接。

您可以使用ThreadPool類來觸發後臺線程來處理連接。