我试图通过保持响应来使我的Bot更加流畅,直到消息变得稀疏。
我的想法很简单:每次收到消息时,我都会产生一个延迟的任务,告知将来我是否应该回应最近的活动。
using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;
namespace GupyInterviewBot.Dialogs
{
[Serializable]
public class InterviewDialog : IDialog<object>
{
private int _patience = 0;
public async Task StartAsync(IDialogContext context)
{
_patience = 0;
context.Wait(PatientReadAsync);
}
public async Task PatientReadAsync(IDialogContext context, IAwaitable<IActivity> awaitable)
{
var activity = await awaitable;
if (activity.Type == ActivityTypes.Message)
{
HoldOn();
context.Wait(PatientReadAsync);
}
else
{
await context.PostAsync("My patience is running out: " + _patience);
context.Wait(PatientReadAsync);
}
}
private void HoldOn(int seconds = 3)
{
Task.Run(async () =>
{
_patience += 1;
await Task.Delay(seconds * 1000);
_patience -= 1;
});
}
}
}
问题是,_patience
计数器只是增加而且从不减少我不明白为什么。我在没有提到框架的情况下发布了这个问题,但在尝试使用控制台应用程序找到MWE后,一切正常。现在我相信有一些与框架保持状态的方式有关,但我不确定。
您可以证明_patience
仅通过发送一些消息然后在Bot仿真器中发送一些Ping
活动来增加。
答案 0 :(得分:1)
将您的代码更改为:
private async Task HoldOnAsync(int seconds = 3)
{
_patience += 1;
await Task.Delay(seconds * 1000);
_patience -= 1;
}
并更改
HoldOn();
到
await HoldOnAsync();
Task.Run()
只是排队任务并立即返回。所以它可能正在发挥作用,但你的增量正在赢得比赛。