2014-12-10 2 views
0

나는 클라이언트에게 메시지를 보내고 응답을받지 않을 필요가있는 서버용 웹 소켓 목록을 유지하려고한다. 처음에 WebSocket을 만들 때 나중에 사용하기 위해 목록에 소켓 참조를 추가하기 만하면됩니다.작업이 끝나면 GC가 WebSocket을 삭제하지 못하도록 막으시겠습니까?

... 

static Dictionary<int,WebSocket> wsDict = new Dictionary<int,WebSocket>(); 

... 

private Task ProcessWS(AspNetWebSocketContext context) 

{ 

    wsDict[id] = (context.WebSocket); 
    ... 

} 
(Finishes running the method and returns) 

문제 나 데 내가 GC가 웹 소켓 폐기 믿고, 그래서 나중에 그것을 사용하려고 할 때 나는 'System.ObjectDisposedException'를받을 수 있습니다. GC 폐기시 영구적으로 멈추는 방법이 있습니까?

편집 : 원래 ApiController를 상속 한 전체 클래스는 (이름에서 알 수 있듯이) 컨트롤입니다. 클라이언트는 GET 요청을 통해 WebSocket을 시작하고 위의 메서드를 호출하여 사전을 소켓에 저장하려고 시도합니다 (int에 매핑 됨). 사전 자체는 정적입니다.

Dict 벌금 및 디버거에서 모든 것을 저장합니다. ProccessWS가 완료된 후 문자 그대로 처리하는 것만으로는 중지 할 수있는 방법을 찾지 못하는 것 같습니다. 루프/슬립 타이머를 ProcessWS 하단에 추가하면 정상적으로 작동하지만 실행 가능한 솔루션이 아닙니다.

이 문제는 원래 각 REST 호출이 상태 저장이 가능할 때 가능할 지 모르는 문제 였지만 원래의 진술과 모순되는 모든 연결을 유지 관리해야합니다. 당신은 기다리고해야

+0

수집에서 개체를 방지하는 방법은이 도달 남아 있도록하는 것입니다. 안타깝게도 모든 사람이 시나리오에서 도달 할 수없는 이유를 이해할 수있는 충분한 컨텍스트를 제공하지 않았습니다. 'wsDict'가 도달 할 수 있으면, 그 안에'WebSocket' 인스턴스 참조도 저장됩니다. (BTW : 당신은'if'를 필요로하지 않습니다 ... 단지 항상'wsDict [id] = context.WebSocket;'을 실행하십시오) ** http://stackoverflow.com/help/mcve**를보십시오 –

+0

아마 당신은 클라이언트가 GET 요청과는 별도로 소켓을 생성하게하여 객체의 수명을 제어 할 수 있습니다. 그러나 좋은 코드 예제를 제공하기 전까지는 확실히 알 수 없습니다. 참고 : GC는 객체가 도달 할 수없는 경우에만 최종자를 통해 객체를 삭제합니다. 귀하의 질문에서 GC가 귀하의 객체 또는 코드의 다른 부분을 처분하는 것을 실제로보고 있는지 여부는 명확하지 않습니다. 나중에 객체에 액세스 할 수 있고 예외를 받으면 객체 및 객체를 처리하는 GC가 아닙니다. –

+0

소켓이 vTortola에서 언급 한대로 연결되어있는 동안 읽기 소켓을 기다려야합니다. ProcessWs에서 컨트롤이 반환되면 소켓이 삭제되기 때문입니다. – SHM

답변

1

는 WS가 연결되어있는 상태 읽

public class WSHandler : IHttpHandler 
{ 
    public bool IsReusable { get { return false; } } 

    public void ProcessRequest(HttpContext context) 
    { 
     if (context.IsWebSocketRequest) 
     { 
      context.AcceptWebSocketRequest(ProcessWS); 
     } 
    } 

    private async Task ProcessWS(AspNetWebSocketContext context) 
    { 
     WebSocket socket = context.WebSocket; 

     ... 

     while (socket.State == WebSocketState.Open) 
     { 
      WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None) 
                 .ConfigureAwait(false); 

      ... 
     } 
    } 
} 
관련 문제