Lync SDK BeginSendMessage 异步回调
Lync SDK BeginSendMessage AsyncCallback
我使用 Lync SDK 2013 并想向联系人发送即时消息。
private void SuppressIncomingConversation(Conversation conversation)
{
InstantMessageModality instantMessageModality = conversation.Modalities[ModalityTypes.InstantMessage] as InstantMessageModality;
instantMessageModality.BeginSendMessage("No.", null, null);
conversation.End();
}
BeginSendMessage
的第二个参数是AsyncCallback
类型的回调。
上面的代码工作正常,但我应该将 conversation.End();
放入回调参数吗?
我该怎么做,我试过了() => conversation.End()
但是回调需要一些参数。
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
}
});
此外,您可能想检查一下您是否只处理 "audio / video calls"...因为您可能要结束其他类型的呼叫...
你这样做是为了检查调用是否具有 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);
}
}
最后一点,您还可以提供 "reason"(如 Busy)来声明通话,而不是使用 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();
}
}
我使用 Lync SDK 2013 并想向联系人发送即时消息。
private void SuppressIncomingConversation(Conversation conversation)
{
InstantMessageModality instantMessageModality = conversation.Modalities[ModalityTypes.InstantMessage] as InstantMessageModality;
instantMessageModality.BeginSendMessage("No.", null, null);
conversation.End();
}
BeginSendMessage
的第二个参数是AsyncCallback
类型的回调。
上面的代码工作正常,但我应该将 conversation.End();
放入回调参数吗?
我该怎么做,我试过了() => conversation.End()
但是回调需要一些参数。
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
}
});
此外,您可能想检查一下您是否只处理 "audio / video calls"...因为您可能要结束其他类型的呼叫...
你这样做是为了检查调用是否具有 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);
}
}
最后一点,您还可以提供 "reason"(如 Busy)来声明通话,而不是使用 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();
}
}