2014-12-23 3 views
1

나는 리모팅에 대해 공정한 조언을 읽었지만, 거의 모든 것이 서버를 호출하는 아이의 컨텍스트에서 나온 것 같아서, 여기서 내가해야 할 일에 대해 꽤 혼란 스럽다.생성 및 관리 된 MarshalByRefObject 서버는 어떻게 처분해야합니까?

C# 스크립트 집합을 별도의 응용 프로그램 도메인으로 컴파일하는 .NET 3.5 서버 응용 프로그램이 있습니다. 이 응용 프로그램 도메인에 대한 모든 호출은 동기식이며 MarshalByRefObject를 상속 한 새로 만든 '공급자'개체를 가져 와서 서버 응용 프로그램 도메인의 기능에 액세스 할 수 있습니다.

은 그래서 서버 응용 프로그램 도메인에서 실행, 다음 주로 간단한 예를 가지고 :

object RunScript() 
{ 
    var myProvider = new MyProvider(this); // Inherits MarshalByRefObject 

    // Passes myProvider to the script appdomain 
    var results = CallAMethodInScriptAppDomain(myProvider); 

    // I want myProvider to be garbage collectable from here. 

    return results; 
} 

나는 그것이 내가 아직 수집지고 있었다 않았다 스폰서와 함께 작업하고 과거에 임대하지만 어떤 점점 시도했다. 나는 그것이 클라이언트에서 사용되도록 고안되었고 서버에서이 객체의 수명을 관리하려고하기 때문에 그것이라고 생각합니다.

실제로 서버 appdomain의 코드 줄을 정확히 알고 있습니다 (또는 수집 할 수 있어야 함). 스크립트 호출이 얼마나 오래 걸리더라도 그 전에 수집해서는 안됩니다. 스크립트 호출은 몇 밀리 초 정도이지만 이론적으로는 몇 시간이 걸릴 수도 있습니다).

현재 내 InitializeLifetimeService는 스크립트를 실행하는 동안 수집하지 못하게 할 수있는 유일한 방법이기 때문에 null을 반환합니다.

아이디어가 있으십니까?

+0

스택 오버플로에 오신 것을 환영합니다! Remoting은 기존 응용 프로그램과의 호환성을 유지하기 위해 유지되는 새로운 기술이므로 새로운 개발에는 권장되지 않습니다. 이제 분산 응용 프로그램은 WCF 또는 ASP.NET 웹 API를 사용하여 개발해야합니다. http://msdn.microsoft.com/en-us/library/vstudio/xws7132e.aspx의 맨 위에있는 참고 자료를 참조하십시오. –

+0

이것은 실제로 새로운 개발이 아닙니다. 5 년 전인 지금 우리는 스크립팅 시스템에서 훨씬 더 무거운 작업량을 가진 새로운 클라이언트를 얻었습니다. 즉, 순간에 발생한 메모리 누수가 갑자기 문제가되었음을 의미합니다. 이것은 '분산 된'응용 프로그램이 아니므로 모두 단일 프로세스에서 실행됩니다. 샌드 박스 및 다시 컴파일을 위해 자신의 AppDomain에있는 스크립트 일 뿐이며 원격 통신을 사용합니다. WCF는 여전히 그 시나리오에 적용됩니까? –

+0

예, WCF가 새로운 개발 일 경우 적용됩니다. 메모리 내 시나리오에 최적화 된 채널 유형이 있다고 생각합니다. –

답변

2

InitializeLifetimeService는 ISponsor 구현을 등록 할 수있는 ILease 구현을 반환해야합니다. 스폰서의 속성은 Finished로 설정할 수 있습니다.이 속성은 서버 클래스를 완료 한 후 true로 설정되며, 프레임 워크에서 임대 기간에 대한 갱신을 호출하면 스폰서는 속성을 검사하고 Finished가 false 인 경우리스를 갱신 할 수 있습니다. 이 문서는 설명

는 qutie 잘입니다 : http://msdn.microsoft.com/en-us/magazine/cc300474.aspx

하고 복사 할 수 있습니다 코드가 있습니다.

+0

내가 어디에서 잘못되고 있는지 궁금한 점이 있는데, 실제로 스크립트 응용 프로그램 도메인에서이 스크립트를 작성해야합니까? 원래 서버 응용 프로그램 도메인에서 만들려고했는데 그 이유는 클래스로 끝났을 때를 알고있는 서버이기 때문입니다. 나는 당신이 여러 번 링크 한 기사를 읽었지만 단지 혼란 스럽습니다. 왜냐하면 그것이 객체의 수명이 오히려 무엇인지를 아는 서버 일 때 실제로 어디에서해야하는지 잘 설명하지 않았기 때문입니다. 고객. –

+0

나는 공급자 (인터페이스)를 서버에 전달하고이 경우 CallAMethodInScriptAppDomain을 호출하게하고 서버가 객체에 대한 핸들을 가질 수 있으므로 생애에 대해 걱정할 필요가 없습니다. 그것이 완료되면 그것을 처분해라, 나는 그것이 당신의 후기의 코멘트를 읽는 것을 깨닫는다. 그러나 이것은 실현 가능하지 않을 수있는 레거시 앱이다. – Kell

+0

나는 당신이 무슨 일이 일어나고 있는지 오해했는지 또는 내가 당신의 대답을 오해했는지 확실하지 않습니다. 서버는 공급자를 생성하여 서버에 전달하고 간접적으로 해당 서비스에 액세스 할 수 있도록 스크립트에 전달합니다. 그래서 서버는 객체에 대한 핸들을 가지고 있으며 모든 자식 객체를 처리 할 수 ​​있습니다. 문제는 제공자 객체 자체 (그리고 원격 객체로드)가 생존 상태로 유지된다는 것입니다. 왜냐하면 내가 말했듯이리스를 반환하지 않기 때문입니다. . –