为了账号安全,请及时绑定邮箱和手机立即绑定

事件多次触发(Lync SDK 2013)

事件多次触发(Lync SDK 2013)

C#
慕妹3242003 2021-12-05 14:46:16
我使用 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();        }你可以在这里看到完整的例子https://pastebin.com/1tR3v8We我认为出现错误是因为我总是将额外的事件侦听器附加到 LyncClient。但我必须TrySetClient()每秒检查客户端连接,因为 Skype 应用程序可能会关闭、崩溃等。我怎样才能解决这个问题?
查看完整描述

1 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

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


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


如果您不知道是否已连接处理程序,则可以使用一个“技巧”。您可以删除一个处理程序,如果它不存在,它就会被忽略。


这允许您执行以下操作:


client = LyncClient.GetClient();

client.ClientDisconnected -= Client_Disconnected;

client.ClientDisconnected += Client_Disconnected;

client.StateChanged -= Client_StateChanged;

client.StateChanged += Client_StateChanged;

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


更强烈建议您在完成处理后很好地移除句柄,因为让它们保持连接可能会使您的类保留在内存中。如果您不小心,这可能会导致实时泄漏。


查看完整回答
反对 回复 2021-12-05
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信