1

メッセージがまばらになるまで応答を保持することで、ボットをより流動的にしようとしています。

私のアイデアは単純でした。メッセージを受信するたびに、遅延タスクを生成して、最近のアクティビティに応答する必要があるかどうかを将来の私に通知します。

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いくつかのメッセージを送信Pingしてから、ボット エミュレーターでいくつかのアクティビティを送信することで、増加しているだけであることを証明できます。

4

1 に答える 1

1

コードを次のように変更します。

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

変更する

HoldOn();

await HoldOnAsync();

Task.Run()タスクをキューに入れ、すぐに戻ります。したがって、おそらく機能していますが、インクリメントが競争に勝っています。

于 2016-11-07T20:46:41.637 に答える