나는 리모팅에 대해 공정한 조언을 읽었지만, 거의 모든 것이 서버를 호출하는 아이의 컨텍스트에서 나온 것 같아서, 여기서 내가해야 할 일에 대해 꽤 혼란 스럽다.생성 및 관리 된 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을 반환합니다.
아이디어가 있으십니까?
스택 오버플로에 오신 것을 환영합니다! Remoting은 기존 응용 프로그램과의 호환성을 유지하기 위해 유지되는 새로운 기술이므로 새로운 개발에는 권장되지 않습니다. 이제 분산 응용 프로그램은 WCF 또는 ASP.NET 웹 API를 사용하여 개발해야합니다. http://msdn.microsoft.com/en-us/library/vstudio/xws7132e.aspx의 맨 위에있는 참고 자료를 참조하십시오. –
이것은 실제로 새로운 개발이 아닙니다. 5 년 전인 지금 우리는 스크립팅 시스템에서 훨씬 더 무거운 작업량을 가진 새로운 클라이언트를 얻었습니다. 즉, 순간에 발생한 메모리 누수가 갑자기 문제가되었음을 의미합니다. 이것은 '분산 된'응용 프로그램이 아니므로 모두 단일 프로세스에서 실행됩니다. 샌드 박스 및 다시 컴파일을 위해 자신의 AppDomain에있는 스크립트 일 뿐이며 원격 통신을 사용합니다. WCF는 여전히 그 시나리오에 적용됩니까? –
예, WCF가 새로운 개발 일 경우 적용됩니다. 메모리 내 시나리오에 최적화 된 채널 유형이 있다고 생각합니다. –