事件多次触发 (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应用程序可能会关闭,崩溃等。

我该如何解决这个问题?

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

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

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

这允许您执行以下操作:

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

如果您对所有句柄执行此操作,那么这将解决您的问题。

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

相关内容

  • 没有找到相关文章

最新更新