【发布时间】:2011-11-04 03:38:25
【问题描述】:
我有一个我们公司的帮助台包,我正在尝试与远程桌面集成。我希望实现的功能之一是能够确定(当您浏览我们的客户端列表时)远程桌面连接当前是否可用于所选系统。我使用的库是“Microsoft Terminal Services Control” - (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 组件)是不可行的,并且任何关于可能需要哪些步骤才能使其工作的进一步指导将不胜感激.
【问题讨论】:
-
您可能想阅读我提出的这个问题:stackoverflow.com/questions/804968/…。就我而言,我在计时器线程中创建并运行 ActiveX 控件。
-
您违反了 STA 线程的硬性要求:它们必须泵送消息循环。它用于编组调用,但 COM 组件经常在内部使用它来处理同步。
标签: c# .net multithreading com