2012-05-21 2 views
2

비동기 소켓 서버가 있습니다. 문제가있는 클라이언트와 네트워크 이벤트를 재생하기 힘든 문제로 인해 [[]가 (가) 고정 된 숫자의 미친 숫자가 고정되는 문제가 발생했습니다. 클라이언트를 처리하기위한 모든 스레딩이 암묵적이므로 (BeginAcceptClient를 사용하고 명시 적으로 인스턴스화 된 스레드 대신 콜백을 사용함) 고정 프로세스를 제어하지 않습니다. "암시 적 스레딩 (implicit threading)"이란 스레드가 직접 생성하지는 않지만 응용 프로그램을 호스팅하는 런타임을 의미합니다. .NET 소켓 서버에서 자동으로 고정 된 바이트 []의 고정 해제

은 어쨌든 this 게시물에 대답은 오브젝트를 고정 해제하는 방법을 보여줍니다. 전방으로 가서 내 바이트 [] 자신을 고정시키고 BeginRead를 수행하고 정리 중에 고정을 해제하면 장면 고정을 무시할 수 있습니까?

감사합니다.

답변

4

링크 된 게시물의 답변은 완전히 잘못되었습니다 (방금 의견을 남기 셨습니다). 마지막으로 고정 된 핸들 (더 일반적인 : GCHandles 이외의 이유가있어 "이유"고정)이 제거 될 때만 오브젝트가 고정 해제됩니다. 고정 해제를 강요 할 수 없습니다. 그것은 몹시 위험 할 것입니다. 보안 문제 인 안전하지 않은 일을하기 위해 안전한 관리 코드를 사용할 수 있습니다! 당신이 개체의 고정 방지하기 위해 시도하는

어쨌든, 이해가되지 않습니다. 이것이 가능하지 않더라도, 프로세스가 임의의 시간에 충돌합니다! 소켓은 정확성을 위해 고정에 의존합니다. 그것은 이유없이 이것을하지 않습니다.

솔루션

은 다른 곳에 :

  1. 때문에 모든 버퍼 메모리에 인접 응용 프로그램 시작시 모든 버퍼를 작성합니다. 버퍼 풀을 사용하십시오.
  2. 작은 수의 큰 버퍼를 사용하여 개별 클라이언트에 섹션을 할당하십시오.

작은 쪽 참고 사항 : 고정 기능 당신이 생각하는 것과 다르게 구현됩니다. 고정은 개체에서 켜고 끌 수있는 플래그가 아닙니다. 뭔가 핀을 고정하면 처음에는 특별한 일이 발생하지 않습니다. GC가 실행될 때만 GC는 고정되는 특수 속성이있는 참조가 있음을 감지합니다. 그런 다음 개체가 이동하는 것을 방지합니다.

+1

감사합니다. – kmarks2

1

난 당신 대신 핀/고정 해제에 초점을 다른 응용 프로그램 도메인에서 소켓 호출을 모두 수행하는 것이 좋습니다 것입니다. 그런 다음 '유휴/안전'시점에 AppDomain을 언로드하고 다시로드하여 메모리를 양호한 상태로 재설정 할 수 있습니다.

+1

그는 사용되지 않은 모든 버퍼도 지울 수있는 수동 GC를 수행 할 수 있습니다. appdomain을 종료해도 GC와 관련된 새로운 기능은 추가되지 않습니다. GC는 프로세스 전역입니다. – usr

+1

GC는 프로세스 전역이지만 AppDomain을 지우면 해당 도메인의 항목에 대한 모든 종료자를 호출합니다. 그 중 하나가 버퍼를 계속 잡고있는 GCHandle에서 Free를 호출 할 수 있습니다. 문제의 코드에 따라 다르지만 GC가 다음 스윕에서 수집 할 수 있도록 배열을 비울 수 있습니다. – GWLlosa

+1

핸들 누출이 있다고 가정합니다. BCL Socket 구현에는 확실하게 어떤 것도 없으며, 스스로를 고정시키고 있지도 않습니다. 어쨌든, appdomain을 종료하면 소켓이 분리됩니다. – usr

관련 문제