首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lync AsyncCallback

Lync AsyncCallback
EN

Stack Overflow用户
提问于 2018-08-21 14:43:31
回答 1查看 208关注 0票数 0

我使用Lync 2013,并希望向联系人发送即时消息。

代码语言:javascript
复制
    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(),但回调需要一些参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-22 17:49:44

LyncClient2013API中的异步API是标准C#异步API的旧风格。

因此,API为所有ASYNC操作提供了StartXxx和匹配的EndXxx。当EndXxx完成时,您需要调用AsyncCallback。

实际上有很多种方法来处理这个问题。一种常见的方法是提供一个回调来调用EndXxx方法。

例如:

代码语言:javascript
复制
InstantMessageModality instantMessageModality = conversation.Modalities[ModalityTypes.InstantMessage] as InstantMessageModality;
instantMessageModality.BeginSendMessage("No.", ar =>
    {
        try
        {
            instantMessageModality.EndSendMessage(ar);
        }
        catch (Exception ex)
        {
            // log ex message
        }
    });

此外,您可能希望检查您唯一处理的“音频/视频通话”只.因为你可能会结束其他类型的电话..。

您这样做,正在检查调用是否有一个AVModality。

代码语言:javascript
复制
if (conversation.Modalities.ContainsKey(ModalityTypes.AudioVideo))

另一个问题是会话可能处于无法执行所需的异步操作的状态,您可以测试是否允许使用CanInvoke方法执行操作。e.g

代码语言:javascript
复制
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来终止会话.

例如:

代码语言:javascript
复制
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();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51951234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档