我使用Lync 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(),但回调需要一些参数。
发布于 2018-08-22 17:49:44
LyncClient2013API中的异步API是标准C#异步API的旧风格。
因此,API为所有ASYNC操作提供了StartXxx和匹配的EndXxx。当EndXxx完成时,您需要调用AsyncCallback。
实际上有很多种方法来处理这个问题。一种常见的方法是提供一个回调来调用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方法执行操作。e.g
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();
}
}https://stackoverflow.com/questions/51951234
复制相似问题