2008-11-06 6 views
6

다음과 같은 기본 아키텍처를 가진 앱이 있습니다..NET 원격 호출을 디버깅하는 방법?

원격 액세스 (.NET Remoting)를 위해 .NET 유형 (RemoteObject)을 등록하는 Windows 서비스 (서비스)입니다. RemoteObject는 ThreadPool을 사용하여 IO 처리를 수행하는 비 ThreadPool 스레드를 작성합니다. 스레드 풀의 크기는 특정 이유로 제한되어야합니다. GUI 응용 프로그램은 .NET Remoting을 사용하여 RemoteObject에 액세스합니다.

ThreadPool의 크기가 너무 작 으면 RemoteObject를 호출 할 때 GUI 응용 프로그램이 멈추는 것으로 나타났습니다.

내 질문은 왜 이것이 걸려 있는지, 그리고 RemoteObject 스레드가 ThreadPool의 영향을받는 이유를 어떻게 알 수 있습니까?

이것은 나를 미치게합니다. 도와 줘서 고마워!

+0

"RemoteObject는 ThreadPool을 사용하여 IO 처리를 수행하는 비 ThreadPool 스레드를 만듭니다." 이것은 이유가 될 수 없습니다 (즉, 비 ThreadPool 스레드는 ThreadPool 슬롯이 열리기를 기다리고 있습니다)? – Alan

+0

RemoteObject가있는 스레드에 영향을주는 이유는 무엇입니까? GUI는 호출하고있는 RemoteObject 메서드에 들어갈 수도조차 없습니다. – Chris

+0

WCF를위한 리모팅을 돌릴 가능성이 있다면 – Will

답변

4

.NET Remoting 인프라는 .NET ThreadPool (또는 기본 리소스를 공유 함)을 사용하므로 모든 ThreadPool 스레드가 앱에서 사용 중이면 원격 전화가 끊길 수 있습니다.

2

이것은별로 도움이되지 않을 수도 있지만 어쨌든 그것을 던져 버릴 것입니다.

원격 처리를 통해 대화하는 클라이언트와 서비스를 디버깅 할 때 대개 항상 클라이언트와 서비스를위한 두 개의 디버거 인스턴스를 실행합니다. 그냥 분명히하기 위해, 나는 Visual Studio의 두 복사본을 실행 중입니다. 서비스의 경우 attach 명령을 사용하거나 기본 및 호출 시작을 직접 변경할 수 있습니다 (모든 서비스 코드 무시).

여기에 내가 메인을 변경하여 디버깅을 활성화하는 방법과 서비스에 대한 DebugService 호출을 수행하는 방법이 있습니다. 실제로는 start를 호출하는 엔트리 포인트입니다. 이 서비스가 있으면 정의 된 SERVICE_DEBUG으로 서비스 디버그를 사용하거나 을 추가하여 #if을 변경하면됩니다. 이제 기본적으로 서비스를 콘솔 앱으로 변환했습니다.

#if SERVICE_DEBUG 
      ServiceHost s = new ServiceHost(); 
      s.DebugService(); 
      Thread.Sleep(300000000); 

#else 
      ServiceBase.Run(ServicesToRun); 
#endif 

당신은 설치하고 원격 호출은 당신이 두 가지를 동시에 디버깅 할 수 있도록 서비스 코드를 단계별로 할 수있는 서비스를 공격 할 때, 클라이언트를 단계별로 실행시켜 모두가 있으면.

호기심을 벗어남 GUI 스레드에서 직접 원격 객체를 호출 하시겠습니까? 그렇다면 원격 호출이 완료 될 때까지 GUI 스레드가 차단됩니다. 이렇게하면 전체 GUI가 잠기고 응답하지 않게됩니다. 이것은 문제의 해결책이 아니지만, 서비스 스레드가 리턴되지 않는 경우, GUI가 정지하게됩니다.

+0

! 정말 좋지 않습니다. 전환 할 때 'n'으로 접두사를 붙이십시오. – leppie

4

이것이 도움이되는지 확신 할 수 없지만 서비스를 실행중인 상태로 디버깅하고 싶다면 코드에서 이것을 치지 마십시오.

#if DEBUG 
      if (!System.Diagnostics.Debugger.IsAttached) 
       Debugger.Launch(); 
#endif 

그리고 디버거를 선택하라는 대화 상자가 나타납니다. 실행중인 서비스 인스턴스에 쉽게 연결할 수 있습니다. 그 밖의 것이 없다면 UI가 멈 추면 (디버그 도구 모음의 일시 중지 버튼을 눌러) 서비스를 중단하고 스레드와 콜 스택을 체크 아웃 할 수 있습니다.

+0

나는 질문자 문제가 없지만이 솔루션은 나를 크게 도와주었습니다. :) – rythos42

1

몇 년 전에 .NET Remoting을 사용하는 중요한 비즈니스 시스템을 설계하고 구현했습니다. Windows Forms GUI, Windows 서비스로 구현 된 서버 및 SQL Server 데이터베이스로 구현 된 클라이언트가있었습니다.

문제 해결/디버깅/개발을 위해 설계되었으므로 첫 번째 디자인 기준 중 하나는 전체 .NET Remoting 구현을 쉽게 제거하고 데스크톱에서 전체 시스템을 실행할 수 있다는 것입니다. 그래서, 나는 하나의 부울 구성 설정을 "false"= off로 변경하여 원격 작업을 비활성화 할 수 있습니다.그런 다음 .NET Remoting의 오버 헤드 나 간섭없이 문제를 해결하고 디버그하고 완벽하게 개발할 수있었습니다.

귀하의 상황에도 유용 할 것으로 보입니다. 사실 구현하기가 쉽지 않기 때문에 바람직하지 않은 상황을 상상할 수는 없습니다.

구현하기 위해 각 클라이언트와 서버 코드에서 구성 설정을 사용하여 상대방과의 통신을 위해 인스턴스화 할 구현 클래스를 결정했습니다. 모든 통신은 양측에 두 개의 구체적인 구현 클래스가있는 사용자 지정 C# 인터페이스를 통해 발생했습니다. 한 클래스는 .NET Remoting을 사용하여 통신을 구현했으며 다른 클래스는 직접적인 프로세스 내 통과 (직접 호출)로 통신을 구현했습니다.

한 쌍의 클래스 (각면에 하나씩) 만 .NET Remoting에 대해 알았으므로 격리가 총계였습니다. 대부분의 경우, 모든 개발자는 리모콘을 끄고 더 빠르고 간단하게 작업했습니다. 드문 경우지만, 필요할 때, 대부분 켜기 만했거나 누군가 문제 해결을 위해 테스트/프로덕션에 연결했을 때. 그런데

, 나는 원격 인터페이스 죽은 간단했다 : 공공 응답 실행 (요청)을 넘어

, 나는 또한 끝이 위에서 언급 한 실행 디버거를 사용을, 그리고 당신이 염두 할 필요가 있음을 동의합니다 GUI 스레딩에 대한 영향.

관련 문제