BotBuilder异步计数器实现与任务不工作



我试图让我的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活动来增加。

修改代码:

private async Task HoldOnAsync(int seconds = 3)
{
    _patience += 1;
    await Task.Delay(seconds * 1000);
    _patience -= 1;
}

和改变

HoldOn();

await HoldOnAsync();

Task.Run()只是将任务排队并立即返回。所以它可能是工作的,但你的增量是赢得比赛。

最新更新