Lync Client 2013 API 中的异步 API 是标准 C# 异步 API 的旧样式。
因此,API 具有 StartXxx 和一个匹配的 EndXxx 用于所有 ASYNC 操作。您需要在 AsyncCallback 完成时调用 EndXxx。
实际上有很多方法可以处理这个问题。一种常见的方法是提供回调来调用 EndXxx 方法。
例如
InstantMessageModality instantMessageModality = conversation.Modalities[ModalityTypes.InstantMessage] as InstantMessageModality;
instantMessageModality.BeginSendMessage("No.", ar =>
{
try
{
instantMessageModality.EndSendMessage(ar);
}
catch (Exception ex)
{
// log ex message
}
});
此外,您可能想检查一下您是否只处理“音频/视频通话”...因为您可能正在结束其他类型的通话...
您这样做是在检查呼叫是否具有 AVModality
例如
if (conversation.Modalities.ContainsKey(ModalityTypes.AudioVideo))
另一个问题是会话可能处于无法进行您想要的异步操作的状态,您可以使用 CanInvoke 方法测试是否允许您进行操作。
例如
if (conversation.Modalities.TryGetValue(ModalityTypes.InstantMessage, out var modality))
{
if (modality is InstantMessageModality instantMessageModality && instantMessageModality.CanInvoke(ModalityAction.SendInstantMessage))
{
instantMessageModality.BeginSendMessage("No.", ar =>
{
try
{
instantMessageModality.EndSendMessage(ar);
}
catch (Exception ex)
{
// log ex message
}
}, null);
}
}
最后一点,您还可以提供一个“原因”(如忙碌)来声明呼叫,而不是使用 End 来终止对话...
例如
if (conversation.Modalities.TryGetValue(ModalityTypes.AudioVideo, out var modality))
{
if (modality is AVModality avModality && avModality.CanInvoke(ModalityAction.Disconnect))
{
avModality.BeginDisconnect(ModalityDisconnectReason.Busy, ar =>
{
try
{
avModality.EndDisconnect(ar);
}
catch (Exception ex)
{
// log ex message
}
}, null);
}
else
{
// fallback
conversation.End();
}
}