事件多次触发 (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
}
}
您可以在此处查看完整示例
我认为错误的出现是因为我总是将额外的事件侦听器附加到 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;
如果您对所有手柄都这样做,那么这将解决您的问题。
强烈建议您在使用完手柄后妥善移除它们,因为保持连接状态可能会使您的 类 留在内存中。如果您不小心,这可能会导致实时泄漏。
我使用 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
}
}
您可以在此处查看完整示例
我认为错误的出现是因为我总是将额外的事件侦听器附加到 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;
如果您对所有手柄都这样做,那么这将解决您的问题。
强烈建议您在使用完手柄后妥善移除它们,因为保持连接状态可能会使您的 类 留在内存中。如果您不小心,这可能会导致实时泄漏。