событие запускается несколько раз (Lync SDK 2013)

Я использую Lync SDK 2013. При создании нового разговора (любого типа, а не только аудио/видео) мое событие conversation_added запускается несколько раз.

Наличие постоянного доступа к LyncClient требует создания проверки таймера каждую секунду для допустимого подключения к приложению lync.

Я создал фрагмент, который должен работать в приложениях WinForms.

public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
            InitializeConnectionTimer();
        }

        private LyncClient client;
        private ConversationManager conversationManager;
        private Timer connectionTimer;
        private bool networkAvailable;

        private void InitializeConnectionTimer()
        {
            connectionTimer = new Timer
            {
                Interval = 1000
            };

            connectionTimer.Tick += connectionTimer_Tick;

            connectionTimer.Start();
        }

        private void CheckConnection()
        {
            TrySetClient();
            SetConversationManager();
        }

        private void TrySetClient()
        {
            client = null;

            try
            {
                client = LyncClient.GetClient();
                client.ClientDisconnected += Client_Disconnected;
                client.StateChanged += Client_StateChanged;
            }
            catch (Exception)
            {
            }
        }

        private void SetConversationManager()
        {
            if (client != null)
            {
                conversationManager = client.ConversationManager;
                conversationManager.ConversationAdded += Conversation_Added;
            }
            else
            {
                conversationManager = null;
            }
        }

        private void Client_Disconnected(object sender, EventArgs e)
        {
            CheckConnection();
        }

        private void Client_StateChanged(object sender, ClientStateChangedEventArgs e)
        {
            CheckConnection();
        }

        private void connectionTimer_Tick(object sender, EventArgs e)
        {
            CheckConnection();
        }

        private void Conversation_Added(object sender, ConversationManagerEventArgs e)
        {
            System.Diagnostics.Process.Start("https://www.google.com/"); // open Browser window here
        }
    }

и вы можете увидеть полный пример здесь

https://pastebin.com/1tR3v8We

Я думаю, что ошибка возникает из-за того, что я всегда подключаю дополнительные прослушиватели событий к LyncClient. Но я должен проверять клиентское соединение на TrySetClient() каждую секунду, потому что приложение Skype может закрыться, дать сбой и т. д.

Как я могу это исправить?


person hrp8sfH4xQ4    schedule 20.08.2018    source источник


Ответы (1)


Это не проблема lync-client-sdk, а классическая проблема событий C#.

Перед подключением новых дескрипторов необходимо удалить текущие дескрипторы. Вы должны сделать это до того, как очистите указатель клиента.

Есть "трюк", который можно сделать, если вы не знаете, подключили ли вы обработчик или нет. Вы можете удалить обработчик, и если он не существует, он просто игнорируется.

Это позволяет вам сделать это:

client = LyncClient.GetClient();
client.ClientDisconnected -= Client_Disconnected;
client.ClientDisconnected += Client_Disconnected;
client.StateChanged -= Client_StateChanged;
client.StateChanged += Client_StateChanged;

Если вы сделаете это для всех своих ручек, это решит вашу проблему.

Настоятельно рекомендуется аккуратно удалить дескрипторы, когда вы закончите с ними, так как оставление их подключенными может сохранить ваши классы в памяти. Это может привести к живым утечкам, если вы не будете осторожны.

person Shane Powell    schedule 20.08.2018