设置 Activity.Typing 动画的时间

我正在尝试在从服务器获取数据期间创建一些动画。“打字”活动似乎是合理的,但它只能工作约 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 它会产生滞后的行为。是否有可能设置“打字”活动的持续时间或其他方式来防止打开和关闭打字?


蝴蝶刀刀
浏览 143回答 1
1回答

心有法竹

默认情况下,键入仅显示几秒钟。您可以通过以较低频率再次发送打字事件来强制显示打字指示符更长的时间。实现示例,它将每 2 秒发送一次事件,最多 30 秒:public async Task<HttpResponseMessage> Post([FromBody]Microsoft.Bot.Connector.Activity activity, CancellationToken token){&nbsp; &nbsp; // Send Typing messages&nbsp; &nbsp; var typingCancellation = new CancellationTokenSource(TimeSpan.FromSeconds(30));&nbsp; &nbsp; var typingTask = SendTypingActivityUntilCancellation(activity, TimeSpan.FromSeconds(2), typingCancellation.Token);&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; // Activity treatment&nbsp; &nbsp; &nbsp; &nbsp; if (activity.Type == ActivityTypes.Message)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else if (activity.Type == ActivityTypes.Event && activity.ChannelId == ChannelEnum.directline.ToString())&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ...&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; typingCancellation.Cancel();&nbsp; &nbsp; &nbsp; &nbsp; await typingTask;&nbsp; &nbsp; &nbsp; &nbsp; return Request.CreateResponse(HttpStatusCode.OK);&nbsp; &nbsp; }&nbsp; &nbsp; catch (Exception e)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; typingCancellation.Cancel();&nbsp; &nbsp; &nbsp; &nbsp; await typingTask;&nbsp; &nbsp; &nbsp; &nbsp; return Request.CreateResponse(HttpStatusCode.InternalServerError);&nbsp; &nbsp; }}public async Task SendTypingActivityUntilCancellation(Activity activity, TimeSpan period, CancellationToken cancellationtoken){&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var connector = new ConnectorClient(new Uri(activity.ServiceUrl));&nbsp; &nbsp; &nbsp; &nbsp; Activity isTypingReply = activity.CreateReply();&nbsp; &nbsp; &nbsp; &nbsp; isTypingReply.Type = ActivityTypes.Typing;&nbsp; &nbsp; &nbsp; &nbsp; do&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (cancellationtoken.IsCancellationRequested == false)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await connector.Conversations.ReplyToActivityAsync(isTypingReply);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Check again if token has not been canceled during the reply delay&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (cancellationtoken.IsCancellationRequested == false)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; await Task.Delay(period);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; while (cancellationtoken.IsCancellationRequested == false);&nbsp; &nbsp; }&nbsp; &nbsp; catch (OperationCanceledException)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //nothing to do.&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP