2015-01-30 3 views
0

소켓을 통해 텍스트 메신저를 보내거나 보내는 데 사용하는 클래스 라이브러리에 큰 문제가 있습니다. 다음은 간단한 코드입니다.소켓 사용 중 ObjectDisposedException

private void AcceptNewSocket() 
{ 
    Socket socket = list.AcceptSocket(); 
    socket.ReceiveBufferSize = 1001; 
    Thread socketTh = new Thread(new ThreadStart(AcceptNewSocket)); 
    socketTh.Start(); 
    WaitForMessenge(socket); 
} 

private void WaitForMessenge(Socket socket) 
{ 
    byte[] buff = new byte[1001]; 
    int bufcount = socket.Receive(buff); 
    /////////some operations on byte array 
    while(bufcount > 0) 
    { 
     buffcount = socket.Receive(buff); //HERE it throws ObjectDisposedException and source is socket 
     /////some operations on byte array 
    } 
} 

콘솔 응용 프로그램에서 내 라이브러리를 사용할 때 예외는 없습니다. Windows Forms 응용 프로그램에서 사용할 때 발생합니다. 너 나 좀 도와 줄 수있어?

+0

그냥 포기하고 귀하의 네트워킹을 위해 Lindgren과 같은 것을 사용하십시오. raw 소켓으로 작업하는 것은 쉬운 일이 아닙니다. – Luaan

+1

다른 곳에서는 소켓을 닫으면 Receive 메서드를 호출하면 예외가 발생합니다. 객체를 사용하기 전에 객체가 삭제되었는지 확인하십시오. –

+0

나는 그것을 닫지 않는다. 그것은 콘솔 응용 프로그램 사이의 통신에 꽤 잘 실행됩니다. – Wynglarz

답변

0

AcceptNewSocket() 외모가 인 것으로 의심됩니다.. 그것을 강력히 추천합니다.

list.AcceptSocket()은 무엇을합니까? 이것은 소켓을 폐기 할 수있는 위치 일 수 있습니다.

왜 재귀 적으로 스레드를 만드나요? 이렇게하면 수십 개의 스레드를 만들 수 있으므로 소켓을 처리 할 때 예외가 발생합니다.

글쎄 ... 더 나은 preformance 대신 Threads 대신 ThreadPool 클래스를 사용할 것입니다.

+0

죄송합니다. "목록"은 내 tcplistener 개체입니다. 새 스레드를 만들지 않을 때도이 예외가 발생합니다. – Wynglarz

+0

@Wynglarz - Alex의 요점 ** 왜 재귀 적으로 쓰레드를 만드나요? ** 쓰레드를 생성해서는 안되지만, ** AcceptNewSocket() 내부에서 쓰레드를 생성해서는 안됩니다. 메소드는 매우 동일한'AcceptNewSocket()'입니다. 그것은 infinte 재귀를 일으키고,'AcceptNewSocket()'에 대한 첫 번째 호출은 애플리케이션이 죽을 때까지 리소스를 씹을 것이다. –