2013-09-27 5 views
1

При работе с Lync SDK, запуском клиента бок о бок, а затем его закрытием - он покидает осиротевший хост-процесс, который никогда не завершает работу , Мне нужно вручную убить процесс с помощью кода или диспетчера задач, чтобы он исчез. Так что я с кодом в моем приложении запуска. При одновременном выполнении нескольких процессов - я получаю другие проблемы, а также оставляю процессы на неопределенный срок.Клиент Lync Shutdown (слева) с Lync SDK 2013 оставляет сиротские процессы

Последующий за всеми MSDN, как и с примерами, но все же происходит такое же поведение. Это некоторый код в классе-оболочке, который я написал.

public void Startup() 
    { 
     // Same thread should do the startup and shutdown right? 
     var _currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; 

     this.KillRunningBackgroundProcesses("lync"); 
     lyncClient = Microsoft.Lync.Model.LyncClient.GetClient(_sideBySide); 

     // Init lync (needed for side-by-side) 
     if (lyncClient.State == Microsoft.Lync.Model.ClientState.Uninitialized) 
     { 
      lyncClient.BeginInitialize(
       (result) => { lyncClient.EndInitialize(result); } 
       , null); 
     } 

     // Wire events 
     lyncClient.StateChanged += lyncClient_StateChanged; 
     lyncClient.CredentialRequested += lyncClient_CredentialRequested; 
     lyncClient.SignInDelayed += lyncClient_SignInDelayed; 
     lyncClient.CapabilitiesChanged += lyncClient_CapabilitiesChanged; 
     lyncClient.ClientDisconnected += lyncClient_ClientDisconnected; 
     lyncClient.ConversationManager.ConversationRemoved += lyncClient_ConversationManager_ConversationRemoved; 
     lyncClient.ConversationManager.ConversationAdded += lyncClient_ConversationManager_ConversationAdded; 
    } 

Это код отключения:

public void Shutdown() 
    { 
     // Same thread should do the startup and shutdown right? 
     var _currentThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId; 

     // Unwire events 
     lyncClient.StateChanged -= lyncClient_StateChanged; 
     lyncClient.CredentialRequested -= lyncClient_CredentialRequested; 
     lyncClient.SignInDelayed -= lyncClient_SignInDelayed; 
     lyncClient.CapabilitiesChanged -= lyncClient_CapabilitiesChanged; 
     lyncClient.ClientDisconnected -= lyncClient_ClientDisconnected; 
     lyncClient.ConversationManager.ConversationRemoved -= lyncClient_ConversationManager_ConversationRemoved; 
     lyncClient.ConversationManager.ConversationAdded -= lyncClient_ConversationManager_ConversationAdded; 

     //this.lyncClient.BeginShutdown(this.lyncClient.EndShutdown, someStateObject); 
     this.lyncClient.BeginShutdown( 
      (result) => { this.lyncClient.EndShutdown(result); } 
      , null); 

     this.lyncClient = null; 
    } 

Как изящно выйти/выключить клиент Lync, а вместе с ним - процесс?

+0

Как это предназначено для использования, потому что я предполагаю, что это не нормальное поведение, чтобы процесс зависал бесконечно .. или это так? – imbageek

+0

У меня такая же проблема с окнами 8, но она случайно появилась. – Anas

+0

Я делаю то же, что и вы, хотя я и убиваю его после выключения. Кажется, у всех одна и та же проблема, и, похоже, нет никакого приятного решения atm. –

ответ

2

Я прибегал к написанию обертки вокруг класса Client, которая захватывает текущее время, прежде чем я начну инициализировать клиент, а затем, после того, как класс Client инициализирует и выдает новый процесс Lync.exe, сканирует активную Lync.exe обрабатывает и захватывает первый после этого времени запуска и сохраняет этот pid.

Затем, когда я разбиваю класс оболочки, я деинирую объект Client, а затем убиваю процесс с сохраненным pid. Это своего рода ужасный грязный хак, но он работает достаточно хорошо. Единственная проблема заключается в том, что если пользователь рабочего стола запускает Lync в коротком окне, а бок о бок клиент вращается.

Удовлетворительный факт, хотя документация указывает, что вы можете управлять только одним клиентом Lync за раз в бок-о-бок режиме, это ограничение действительно только за процесс. Вы можете управлять произвольным числом сторонних клиентов Lync, если вы создаете их в своем дочернем процессе и обмениваетесь между дочерними процессами и основным процессом.

Смежные вопросы