事件多次触发 (Lync SDK 2013)

event fires multiple times (Lync SDK 2013)

我使用 Lync SDK 2013。创建新对话(任何类型,不仅 audio/video)时,我的 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 应用程序可能会关闭、崩溃等

我该如何解决这个问题?

这不是 lync-client-sdk 问题,而是经典的 C# 事件问题。

在连接新手柄之前,您需要删除当前手柄。您应该在清除客户端指针之前执行此操作。

如果您不知道是否已连接处理程序,可以执行 "trick" 操作。您可以删除一个处理程序,如果它不存在,它就会被忽略。

这允许您这样做:

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

如果您对所有手柄都这样做,那么这将解决您的问题。

强烈建议您在使用完手柄后妥善移除它们,因为保持连接状态可能会使您的 类 留在内存中。如果您不小心,这可能会导致实时泄漏。