원격 데스크톱과 통합하려고하는 회사의 헬프 데스크 패키지가 있습니다. 내가 구현하고자하는 기능 중에는 원격 데스크톱 연결이 현재 선택된 시스템에서 사용 가능한지 여부를 결정할 수있는 기능이 있습니다 (클라이언트 목록을 탐색하는 동안). 내가 사용하고있는 라이브러리는 "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이 작업을 수행하는 데 필요한 단계에 대한 자세한 지침은 매우 유용 할 것입니다. 고맙습니다.
이 질문을 읽는 것이 좋습니다. http://stackoverflow.com/questions/804968/how-can-a-background-thread -hang-the-ui-thread. 필자의 경우 타이머 스레드에서 ActiveX 컨트롤을 만들고 실행합니다. –
STA 스레드에 대한 엄격한 요구 사항을 위반합니다. 메시지 루프를 펌프해야합니다. 호출을 마샬링하는 데 사용되지만 COM 구성 요소는 종종 동기화를 처리하기 위해 내부적으로 사용합니다. –