1

I have 3 Dialogs, there is an InitialDialog, StepOneDialog and finally a EndDialog. Each Dialog invokes it's child by executing something like this:

await context.Forward(dialog, ResumeAfter, new Activity { }, CancellationToken.None); 

This works perfectly locally, but there is an issue when I publish this. It just get's stuck in a loop and I think it's because the Dialog doesn't exit properly. The InitialDialog is inheriting a LuisDialog. I have this code for one of the methods:

[LuisIntent("")] public async Task None(IDialogContext context, LuisResult result) { // Create our response var response = $"Sorry I did not understand your question."; // Post our response back to the user await context.PostAsync(response); // Exit the application context.Done(this); } 

As you can see, I invoke context.Done(this) to exit the Dialog, but I am not sure if that is correct. In other examples, they seem to use context.Wait(MessageReceived);

My other Dialogs implement IDialog<object> so I can't invoke MessageReceived. So in that case, I have set up a method like this:

private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) => context.Done(this); 

which I invoke like this:

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]; var selectedAnswer = await result; // Assign our answer to our question foreach (var answer in question.Answers) if (answer.Text == selectedAnswer) question.Answer = answer; // If we have an answer, filter the products if (question.Answer != null) _productProvider.Score(await GetCurrentProducts(), _groups); // Increase our index _currentQuestion++; // If our current index is greater or equal than the length of the questions if (_currentQuestion == length) { // Create our dialog var dialog = _dialogFactory.CreateSecondStepDialog(_dialogFactory, _groupProvider, _questionProvider, _productProvider, await GetCurrentProducts()); // Otherwise, got to the next step await context.Forward(dialog, ResumeAfter, new Activity { }, CancellationToken.None); return; } // Ask our next question await AskQuestion(context, null); } 

As you can see, the context.Forward passes the method as a Delegate and is executed after the child Dialog is created. Can someone tell me if I am doing this right? Or if I need to change something.

2

1 Answer 1

0

In case forward to Luis dialog message from current dialog you can use:

var _message = context.MakeMessage(); _message.Text = "Custom user query"; await context.Forward(new MyRootLuisDialog(), MyRootLuisDialogComplete, _message); 

In case open Luis (child) dialog you can use:

context.Call(new MyRootLuisDialog(), MyRootLuisDialogComplete); 

Callbacks example:

public virtual async Task MyRootLuisDialogComplete(IDialogContext context, IAwaitable<object> response) { var _response = (MyDialogData)await response; ... } 

Child dialog exit:

... context.Done(_dialogData); // type of _dialogData is MyDialogData ... 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.