在多个线程上运行COM组件控件
本文关键字:COM 组件 控件 运行 线程 | 更新日期: 2023-09-27 18:06:45
我有一个公司的帮助台软件包,我正试图将其与远程桌面集成。我希望实现的功能之一是确定(当您浏览我们的客户端列表时)远程桌面连接当前是否可用于所选系统的能力。我使用的库是"微软终端服务控制"- AxInterop。MSTSCLib AxMsRdpClient7)
现在我的问题是,我想在一个单独的线程上执行这个任务(尝试连接),以防止阻塞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();
}
基本上上面的代码工作完美,如果我在UI线程中执行它,并将控件添加到表单集合,但当我试图在一个单独的线程上运行这个,它似乎根本没有发生任何动作。connect()不会引发异常。没有引发任何事件,似乎什么也没发生。
我想我希望的是确认我正在尝试做的事情(在线程中运行COM组件)实际上是可能的,并且关于需要哪些步骤才能使其工作的任何进一步指导将非常感谢。
好消息是,你正在努力做的事情是可能的。由于您正在创建COM对象并在同一线程中使用它,因此无需担心编组问题。(如果你开始将COM接口指针传递给另一个线程,创建该对象的STA线程将不得不使用消息泵。)
我没有使用MSTSC控件,但我的猜测是,它可能需要托管在一个窗口之前,它将工作,即使它是一个隐藏的窗口。我会创建一个新的形式(在你的后台STA线程),看看是否有帮助。然后,您可以尝试隐藏表单,直到需要显示终端服务客户端。如果您不确定如何在多个线程上拥有多个窗体,请参见多个窗口,多个线程