如何在C#版Bot Framework中实现等待时的进度提示消息?
在Bot Framework(C#)中实现长耗时API的提示消息
嘿,这个需求实现起来挺顺手的,核心就是先给用户发个即时提示,再异步处理耗时的API请求,不让用户傻等没反馈。我给你两种常用的实现方案,适配不同的Bot开发场景:
方案一:在Dialog流程中处理(推荐,适合复杂对话)
如果你的Bot是用Dialog来管理对话流程的(比如WaterfallDialog),直接在对应的Step里先发送提示,再执行API:
private async Task<DialogTurnResult> HandleLongRunningApiStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { // 第一步:立刻发送等待提示 await stepContext.Context.SendActivityAsync( MessageFactory.Text("Please hold on a moment, I am getting the results"), cancellationToken); // 第二步:异步执行耗时API调用 // 如果你的API本身是异步方法,直接await即可 var apiResult = await YourLongRunningAsyncApiCall(cancellationToken); // 如果是同步API,用Task.Run包装避免阻塞Bot主线程 // var apiResult = await Task.Run(() => YourLongRunningSyncApiCall(), cancellationToken); // 第三步:API返回后发送结果 await stepContext.Context.SendActivityAsync( MessageFactory.Text($"Here's what I found: {apiResult}"), cancellationToken); return await stepContext.NextAsync(null, cancellationToken); }
方案二:在TurnHandler中直接处理(适合简单对话)
如果你的Bot逻辑比较简单,直接在OnTurnAsync方法里判断意图并处理:
protected override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default) { if (turnContext.Activity.Type == ActivityTypes.Message) { // 先检测用户触发的意图(这里假设你有自己的意图检测逻辑) var detectedIntent = await GetUserIntentAsync(turnContext, cancellationToken); if (detectedIntent == "YourTargetLongRunningIntent") { // 发送等待提示 await turnContext.SendActivityAsync( MessageFactory.Text("Please hold on a moment, I am getting the results"), cancellationToken); // 执行耗时API var apiResponse = await YourLongRunningApiOperationAsync(cancellationToken); // 返回结果给用户 await turnContext.SendActivityAsync( MessageFactory.Text($"Done! Result: {apiResponse}"), cancellationToken); } else { // 处理其他普通消息/意图 await turnContext.SendActivityAsync(MessageFactory.Text("Got your message! Let me know how I can help."), cancellationToken); } } await base.OnTurnAsync(turnContext, cancellationToken); }
几个关键注意点
- 一定要用异步处理:不管API是同步还是异步,都要确保Bot主线程不被阻塞,否则会影响其他用户的请求处理。
- 传递取消令牌:全程传递
cancellationToken,当用户中断对话或者Bot服务重启时,可以及时取消正在执行的API请求,避免资源浪费。 - 超长时间任务的特殊处理:如果API调用超过15分钟(Bot Framework对话上下文的默认超时),建议用后台任务队列+对话状态持久化的方式,避免对话上下文失效。
内容的提问来源于stack exchange,提问作者user3527063
相关产品推荐
相关产品推荐

