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();
    }
}