为了账号安全,请及时绑定邮箱和手机立即绑定

设置 Activity.Typing 动画的时间

设置 Activity.Typing 动画的时间

C#
蝴蝶刀刀 2021-12-25 18:31:24
我正在尝试在从服务器获取数据期间创建一些动画。“打字”活动似乎是合理的,但它只能工作约 4 秒:Activity reply = activity.CreateReply();reply.Type = ActivityTypes.Typing;reply.Text = null;ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));await connector.Conversations.ReplyToActivityAsync(reply);我试图做异步监听:while (!_fetchEnded){   await connector.Conversations.ReplyToActivityAsync(reply);   Thread.Sleep(3000);}但是 bot 它会产生滞后的行为。是否有可能设置“打字”活动的持续时间或其他方式来防止打开和关闭打字?

1 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

默认情况下,键入仅显示几秒钟。您可以通过以较低频率再次发送打字事件来强制显示打字指示符更长的时间。


实现示例,它将每 2 秒发送一次事件,最多 30 秒:


public async Task<HttpResponseMessage> Post([FromBody]Microsoft.Bot.Connector.Activity activity, CancellationToken token)

{

    // Send Typing messages

    var typingCancellation = new CancellationTokenSource(TimeSpan.FromSeconds(30));

    var typingTask = SendTypingActivityUntilCancellation(activity, TimeSpan.FromSeconds(2), typingCancellation.Token);


    try

    {

        // Activity treatment

        if (activity.Type == ActivityTypes.Message)

        {

            // ...

        }

        else if (activity.Type == ActivityTypes.Event && activity.ChannelId == ChannelEnum.directline.ToString())

        {

            // ...

        }


        typingCancellation.Cancel();

        await typingTask;

        return Request.CreateResponse(HttpStatusCode.OK);

    }

    catch (Exception e)

    {

        typingCancellation.Cancel();

        await typingTask;

        return Request.CreateResponse(HttpStatusCode.InternalServerError);

    }

}


public async Task SendTypingActivityUntilCancellation(Activity activity, TimeSpan period, CancellationToken cancellationtoken)

{

    try

    {

        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));

        Activity isTypingReply = activity.CreateReply();

        isTypingReply.Type = ActivityTypes.Typing;


        do

        {

            if (cancellationtoken.IsCancellationRequested == false)

            {

                await connector.Conversations.ReplyToActivityAsync(isTypingReply);

            }


            // Check again if token has not been canceled during the reply delay

            if (cancellationtoken.IsCancellationRequested == false)

            {

                await Task.Delay(period);

            }

        }

        while (cancellationtoken.IsCancellationRequested == false);

    }

    catch (OperationCanceledException)

    {

        //nothing to do.

    }

}


查看完整回答
反对 回复 2021-12-25
  • 1 回答
  • 0 关注
  • 142 浏览

添加回答

代码语言

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号