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

标签 c# .net multithreading com

我有一个我们公司的帮助台包,我正在尝试将其与远程桌面集成。我希望实现的功能之一是能够确定(当您浏览我们的客户列表时)远程桌面连接当前是否可用于所选系统。我使用的库是“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 组件)是完全可能的,并且非常感谢任何有关使其正常工作可能需要哪些步骤的进一步指导。

最佳答案

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

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

关于c# - 在多个线程上运行 COM 组件控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7198725/

相关文章:

c# - 调用重载函数的泛型 T

.net - 使用 pdfsharp 填充 pdf 文档时,除非单击字段,否则填充的表单不会显示值

android - 让启动 Activity 等待一个过程

c# - 引用 NET MAUI 中的仅限 Windows 的项目

c# - 32位进程无法访问64位进程中的模块

c# - Visual Studio (C#) 'Hot code replace'

c - 向所有线程发送信号

c# - 如何获得 com+ 应用程序的所有 com+ 组件的列表?

.net - 如何测试在VB.net TabControl中选择了哪个选项卡

c++ - 谐波级数和 c++ MPI 和 OpenMP