2010-10-05 37 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类来触发后台线程来处理连接。