I 3 Dialoge haben, gibt es eine InitialDialog, StepOneDialog und schließlich ein EndDialog. Jeder Dialog ruft sie Kind ist durch so etwas wie diese Ausführung:Microsoft Bot Framework-Ausgang ein Dialog
await context.Forward(dialog, ResumeAfter, new Activity { }, CancellationToken.None);
Dies funktioniert perfekt vor Ort, aber es gibt ein Problem, wenn ich diese veröffentlichen. Es hängt nur in einer Schleife und ich denke, es ist, weil der Dialog nicht ordnungsgemäß beendet wird. Die InitialDialog erbt eine LuisDialog. Ich habe diesen Code für eine der Methoden:
[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);
}
Wie Sie sehen können, rufe ich context.Done(this)
den Dialog zu beenden, aber ich bin nicht sicher, ob das richtig ist. In anderen Beispielen scheinen sie context.Wait(MessageReceived);
Meine andere Dialoge implementieren IDialog<object>
so zu verwenden, ich MessageReceived nicht aufrufen kann. Also in diesem Fall habe ich eine Methode wie folgt aufgebaut:
private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result) => context.Done(this);
, die ich wie folgt aufrufen:
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);
}
Wie Sie sehen können, geht die context.Forward
die Methode als Delegierter und ausgeführt wird nach dem untergeordneten Dialog wird erstellt. Kann mir jemand sagen, ob ich das richtig mache? Oder wenn ich etwas ändern muss.
Mögliches Duplikat von [Beendet alle Dialoge und beendet die Konversation in MS Bot Framework, wenn der Benutzer "exit", "quit" usw. eingibt) (http://stackoverflow.com/questions/39113403/terminate-all-dialogs-) und-exit-conversation-in-ms-bot-framework-wenn-der-benutzer-ty) – K48
Stimmen Sie nicht mit dem Duplikat überein: Hier sucht der Benutzer nicht nach solitons, um mit einem Schlüsselwort zu beenden, es sollte getan werden normale Dialogverhalten –