我使用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
}
}
您可以在此处看到完整的示例
我认为出现此错误是因为我总是将其他事件侦听器附加到LyncClient。但是我必须每秒检查TrySetClient()
上的客户端连接,因为Skype应用程序可能会关闭,崩溃等。
我该如何解决?
答案 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;
如果对所有句柄都执行此操作,则可以解决问题。
强烈建议您在完成处理后将其删除,因为将它们保持连接状态可能会使您的类保留在内存中。如果不注意,可能会导致现场泄漏。