2011-08-26 5 views
2

원격 데스크톱과 통합하려고하는 회사의 헬프 데스크 패키지가 있습니다. 내가 구현하고자하는 기능 중에는 원격 데스크톱 연결이 현재 선택된 시스템에서 사용 가능한지 여부를 결정할 수있는 기능이 있습니다 (클라이언트 목록을 탐색하는 동안). 내가 사용하고있는 라이브러리는 "Microsoft Terminal Services Control"입니다. - (AxInterop.MSTSCLib AxMsRdpClient7)여러 스레드에서 COM 구성 요소 제어 실행

이제 내 문제는 UI를 차단하지 못하도록 별도의 스레드에서이 작업 (연결 시도)을 수행하려는 것입니다. 동시에 많은 고객들과 연결을 시도하고있을 수도 있음) 그리고 지금까지 성공하지 못했습니다. 여기

내가 UI 스레드를 실행하고 나는 실행하려고 할 때 폼 컬렉션에 컨트롤을 추가 만하고있는 경우
public void AttemptLogin(string password) 
{ 
    this._thread = new Thread(LoginAttempt); 
    this._thread.SetApartmentState(ApartmentState.STA); 
    this._thread.Start(password); 
} 


protected void LoginAttempt(object password) 
{ 
    AxMsRdpClient7 remoteDesktop = new AxMsRdpClient7(); 
    remoteDesktop.CreateControl(); 

    remoteDesktop.UserName = this._username; 
    remoteDesktop.Server = this._server; 
    WireEventHandlers(remoteDesktop); 
    IMsTscNonScriptable passwordContainer = (IMsTscNonScriptable)remoteDesktop.GetOcx(); 
    passwordContainer.ClearTextPassword = password.ToString(); 
    remoteDesktop.Connect(); 
} 

은 기본적으로 위의 코드는 완벽하게 작동합니다 ... 코드의 생각입니다 이것은 별도의 스레드에서 단순히 아무런 작업도 발생하지 않는 것처럼 보입니다. connect()에서는 예외가 발생하지 않습니다. 이벤트가 발생하지 않으며 아무 일도 일어나지 않습니다.

나는 내가 무엇을하려고하는지 (스레드에서 COM 구성 요소를 실행) 확인이 필요합니다. INFACT POSSIBLE이 작업을 수행하는 데 필요한 단계에 대한 자세한 지침은 매우 유용 할 것입니다. 고맙습니다.

+0

이 질문을 읽는 것이 좋습니다. http://stackoverflow.com/questions/804968/how-can-a-background-thread -hang-the-ui-thread. 필자의 경우 타이머 스레드에서 ActiveX 컨트롤을 만들고 실행합니다. –

+0

STA 스레드에 대한 엄격한 요구 사항을 위반합니다. 메시지 루프를 펌프해야합니다. 호출을 마샬링하는 데 사용되지만 COM 구성 요소는 종종 동기화를 처리하기 위해 내부적으로 사용합니다. –

답변

3

좋은 소식은 당신이하려는 일이 가능하다는 것입니다. COM 개체를 만들고 같은 스레드에서 사용하기 때문에 걱정할 마샬링 문제는 없습니다. COM 인터페이스 포인터를 다른 스레드에 전달하기 시작하면 개체를 만든 STA 스레드는 메시지 펌프를 사용해야합니다.

MSTSC 컨트롤을 사용하지 않았지만 그것이 숨겨진 창이라 할지라도 작동하기 전에 창에 호스트 될 수 있습니다. 나는 (당신의 배경 STA 스레드에서) 새 양식을 만들고 도움이되는지 확인합니다. 그런 다음 터미널 서비스 클라이언트를 표시해야 할 때까지 양식을 숨길 수 있습니다. 여러 스레드에서 여러 양식을 사용하는 방법을 잘 모르는 경우 Multiple Windows, Multiple Threads

+0

창에서 호스팅하는 것이 싫지만 문제가되는 것 같습니다. 건배 –