Запуск управления COM-компонентами в нескольких потоках

2

У меня есть пакет справки для нашей компании, который я пытаюсь интегрировать с Remote Desktop. Среди функциональных возможностей, которые я ищу, - это способность определять (пока вы просматриваете список наших клиентов), если в настоящее время доступно удаленное подключение к рабочему столу для выбранной системы. Библиотека, которую я использую, - "Управление службами терминалов Microsoft" - (AxInterop.MSTSCLib AxMsRdpClient7)

Теперь моя проблема в том, что я хочу выполнить эту задачу (попытку подключения) в отдельном потоке, чтобы предотвратить блокировку пользовательского интерфейса (учитывая, что я могу одновременно пытаться подключиться к многочисленным клиентам) и до сих пор безуспешными.

Вот идея кода...

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();
}

В принципе, код выше отлично работает, если я выполняю его в потоке пользовательского интерфейса и добавляю элемент управления в коллекцию форм, но когда я пытаюсь запустить его в отдельном потоке, кажется, что просто никаких действий не происходит. Исключений не возникает при подключении(). Никаких событий не возникает, и, похоже, ничего не происходит.

Я предполагаю, что я надеюсь, это подтверждение того, что я пытаюсь сделать (запустите COM-компонент в потоке). INFACT ВОЗМОЖНО, и любые дальнейшие указания о том, какие шаги могут потребоваться, чтобы заставить это работать, будут высоко оценены,

  • 0
    Возможно, вы захотите прочитать этот вопрос, который у меня был: stackoverflow.com/questions/804968/… . В моем случае я создаю и запускаю элемент управления ActiveX в потоке таймера.
  • 0
    Вы нарушаете жесткое требование для потоков STA: они должны прокачать цикл сообщений. Он используется для маршалинга вызовов, но компоненты COM часто используют его и для синхронизации.
Теги:
multithreading
com

1 ответ

3
Лучший ответ

Хорошей новостью является то, что то, что вы пытаетесь сделать, возможно. Поскольку вы создаете COM-объект и используете его в одном и том же потоке, тогда нет проблем с сортировкой, о которых нужно беспокоиться. (Если вы начнете передавать указатели интерфейса COM в другой поток, поток STA, который создал объект, должен будет использовать насос сообщений.)

Я не использовал элемент управления MSTSC, но я предполагаю, что он может быть размещен в окне, прежде чем он будет работать, даже если это скрытое окно. Я бы создал новую форму (на вашем фоне поток STA) и посмотрим, поможет ли это. Затем вы можете попытаться скрыть форму до тех пор, пока вам не понадобится отображать клиент служб терминалов. Если вы не знаете, как иметь несколько форм для нескольких потоков, см. Несколько Windows, несколько потоков

  • 0
    Отстой, что хостинг в окне требуется, но, похоже, это исправить ... Ура

Ещё вопросы

Сообщество Overcoder
Наверх
Меню