【问题标题】:Running COM component controls on multiple threads在多个线程上运行 COM 组件控件
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 很糟糕,需要在窗口中托管它,但似乎是解决办法......干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多