在多个线程上运行COM组件控件

时间:2011-08-26 00:20:35

标签: c# .net multithreading com

我正在尝试与远程桌面集成的公司帮助台软件包。我希望实现的功能之一是,如果当前可用于所选系统的远程桌面连接,则可以确定(当您浏览我们的客户端列表时)。我使用的库是“Microsoft终端服务控件” - (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组件)是可能的,并且任何关于可能需要哪些步骤才能使其工作的进一步指导将受到高度赞赏。

1 个答案:

答案 0 :(得分:3)

好消息是你想要做的事情是可能的。由于您正在创建COM对象并在同一个线程中使用它,因此不需要担心编组问题。 (如果您开始将COM接口指针传递给另一个线程,则创建该对象的STA线程必须使用消息泵。)

我没有使用过MSTSC控件,但我的猜测是它可能需要在它工作之前托管在窗口中,即使它是一个隐藏的窗口。我会创建一个新表单(在您的后台STA线程上),看看是否有帮助。然后,您可以尝试隐藏表单,直到您需要显示终端服务客户端。如果您不确定如何在多个线程上使用多个表单,请参阅Multiple Windows, Multiple Threads