2016-12-12 4 views
1

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.

+2

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

+0

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 –

Antwort

0

Bei sich auf Luis Dialog-Nachricht aus dem laufenden Dialog können Sie verwenden:

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

Bei offenem Luis (Kind) Dialog können Sie verwenden:

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

Rückrufe Beispiel:

Ausgang des untergeordneten Dialogfelds:

... 
context.Done(_dialogData); // type of _dialogData is MyDialogData 
... 
Verwandte Themen