【问题标题】:Lync SDK BeginSendMessage AsyncCallbackLync SDK BeginSendMessage AsyncCallback
【发布时间】:2018-08-21 14:43:31
【问题描述】:

我使用 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(),但回调需要带一些参数。

【问题讨论】:

    标签: c# skype lync skypedeveloper lync-client-sdk


    【解决方案1】:

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

    【讨论】:

    • 你好,Shane,这太棒了。因此,如果有人打电话给我,而我使用avModality.BeginDisconnect(ModalityDisconnectReason.Busy,他的电话会被屏蔽吗?
    • Disconnect 方法将具有与“结束”相同的行为,但它提供了一个对调用者/lync 日志记录有用的“原因”。您的“BeginSendMessage”没有调用“EndSendMessage”。我也会在调用 EndSendMessage 之后使用 disconnect 方法。
    • 另外,您可以考虑 DeclineEverywhere 的原因,这将导致您的所有端点警报都结束。
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多