我使用 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;
如果您对所有手柄都这样做,那么这将解决您的问题。
更强烈建议您在完成处理后很好地移除句柄,因为让它们保持连接可能会使您的类保留在内存中。如果您不小心,这可能会导致实时泄漏。
- 1 回答
- 0 关注
- 181 浏览
添加回答
举报
0/150
提交
取消