立即执行动作

r3plica

因此,我创建了以下对话框:

[Serializable]
public class StepOneDialog : IDialog<object>
{

    // Private fields
    protected readonly IList<GroupResponseModel> _groups;
    protected readonly GroupResponseModel _group;
    protected readonly int _currentStep;
    protected int _currentQuestion = 0;

    /// <summary>
    /// Default constructor
    /// </summary>
    /// <param name="groups">The question groups</param>
    public StepOneDialog(IList<GroupResponseModel> groups, int step)
    {
        _groups = groups;
        _group = groups[step];
        _currentStep = step;
    }

    /// <summary>
    /// Start our response
    /// </summary>
    /// <param name="context">The current context</param>
    /// <returns></returns>
    public async Task StartAsync(IDialogContext context) => context.Wait(AskQuestion);

    /// <summary>
    /// When our message is recieved we execute this delegate
    /// </summary>
    /// <param name="context">The current context</param>
    /// <param name="result">The result object</param>
    /// <returns></returns>
    private async Task AskQuestion(IDialogContext context, IAwaitable<IMessageActivity> result)
    {

        // Get our question and answers
        var question = this._group.Questions[_currentQuestion];
        var questionText = question.Text;
        var answers = question.Answers.Select(m => m.Text).ToList();
        var options = new PromptOptions<string>(questionText, options: answers);

        // If wer are the first question AND we have more than 1 question, Post the question header
        if (_currentQuestion == 0 && _group.Questions.Count > 1)
            await context.PostAsync(_group.Text);

        // Ask our question
        Choice<string>(context, GetAnswer, options);
    }

    /// <summary>
    /// Get our answer and decide what to do next
    /// </summary>
    /// <param name="context">The current context</param>
    /// <param name="result">The answer text</param>
    /// <returns></returns>
    private async Task GetAnswer(IDialogContext context, IAwaitable<string> result)
    {

        // Get our quest
        var questions = _group.Questions;
        var length = questions.Count;
        var question = _group.Questions[_currentQuestion];

        // Assign our answer to our question
        foreach (var answer in question.Answers)
            if (answer.Text == await result)
                question.Answer = answer;

        // Increase our index
        _currentQuestion++;

        // If our current index is greater or equal than the length of the questions
        if (_currentQuestion == length)
        {

            // If our step is the same as our group length
            var groupLength = _groups.Count - 1;

            // If we have reached the end of our steps, this dialog is done
            if (groupLength == _currentStep)
                context.Wait(ResumeAfter);

            // Otherwise, got to the next step
            await context.Forward(new StepOneDialog(_groups, _currentStep + 1), ResumeAfter, new Activity { }, CancellationToken.None);

      // Otherwise, ask our next question
        } else
            context.Wait(AskQuestion);
    }

    /// <summary>
    /// When the child dialog has complete, mark this as done
    /// </summary>
    /// <param name="context">The current context</param>
    /// <param name="result">The result object</param>
    /// <returns></returns>
    private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) => context.Done(this);
}

共有3个步骤,因此当第一步开始时,系统会提出一个问题。当用户回答问题时(因为第一步中只有一个问题),将启动对话框的新实例,并提出新的问题。在这种情况下,有多个问题,因此,当用户回答第一个问题时,我希望它立即问第二个问题。问题是我有这个:

// Otherwise, ask our next question
} else
    context.Wait(AskQuestion);

GetAnswer方法中,它将继续等待用户的响应。我不希望它等待用户响应,而只是执行它。有谁知道这是怎么做到的吗?

r3plica

我真傻。我只是将最后一行更改为:

// Otherwise, ask our next question
} else
    await AskQuestion(context, null);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

阻止执行动作

来自分类Dev

执行动作的API路由

来自分类Dev

Wordpress:如何执行动作?

来自分类Dev

ReactJS循环执行动作

来自分类Dev

在动画结束时执行动作

来自分类Dev

Golang获取执行动作的流程时间

来自分类Dev

uilabel可以执行动作吗

来自分类Dev

使用PHP / JS执行动作

来自分类Dev

在某些Y坐标上执行动作

来自分类Dev

在执行动作完成之前释放动作监听器

来自分类Dev

使动态复选框执行并执行动作C#

来自分类Dev

单击菜单项时如何执行动作?

来自分类Dev

Scala:测试结束后如何执行动作?

来自分类Dev

量角器-如何获取刚刚执行动作的元素?

来自分类Dev

起订量 作为参数给出的执行动作

来自分类Dev

如何在GHCJS程序中定期执行动作?

来自分类Dev

如果before_action返回false,如何执行动作

来自分类Dev

如何同时显示模式和执行动作

来自分类Dev

光标进入单元格时执行动作

来自分类Dev

按下按钮时如何执行动作?

来自分类Dev

开始执行动作时如何阻止触摸

来自分类Dev

执行动作时反应+助焊剂改变状态

来自分类Dev

执行动作后的复选框条件渲染-ReactJS

来自分类Dev

C设计模式执行动作列表而不阻塞?

来自分类Dev

如何仅在成功之后执行动作-angularjs

来自分类Dev

量角器-如何获取刚刚执行动作的元素?

来自分类Dev

是否可以在线执行动作事件?

来自分类Dev

区分执行动作的函数和返回的函数之间的区别

来自分类Dev

寻找检测是否按下了键,执行动作