事件触发多次(Lync SDK 2013)

时间:2018-08-20 10:01:13

标签: c# events skypedeveloper lync-client-sdk

我使用Lync SDK2013。创建新会话(任何类型,而不仅仅是音频/视频)时,我的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应用程序可能会关闭,崩溃等。

我该如何解决?

1 个答案:

答案 0 :(得分:1)

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

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

如果您不知道是否已连接处理程序,则可以执行“技巧”。您可以删除处理程序,如果该处理程序不存在,则将其忽略。

这允许您执行以下操作:

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

如果对所有句柄都执行此操作,则可以解决问题。

强烈建议您在完成处理后将其删除,因为将它们保持连接状态可能会使您的类保留在内存中。如果不注意,可能会导致现场泄漏。