BotBuilder异步计数器实现,Task无法正常工作

时间:2016-11-07 19:32:22

标签: c# async-await botframework 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活动来增加。

1 个答案:

答案 0 :(得分:1)

将您的代码更改为:

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

并更改

HoldOn();

await HoldOnAsync();

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