2017-09-21 1 views
2

J'ai un scénario dans lequel je veux transférer le contexte à une autre boîte de dialogue en utilisant Context.Forward et cela fonctionne parfaitement. Maintenant, si je mets à jour le code pour récupérer la pile de dialogues et utiliser DialogStack.Forward, il en résulte une exception Stack is Empty. Tout pointeur sur cette question sera très apprécié.DialogStack.Forward ne fonctionne pas où dans Context.Forward fonctionne

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) 
{ 
var botData = scope.Resolve<IBotData>(); 
await botData.LoadAsync(default(CancellationToken)); 
var stack = scope.Resolve<IDialogStack>(); 

// DialogStack.Foward doesn't work 
await stack.Forward(new FeedbackDialog(FeedbackContext.CreateLead.ToString(), this.GetService<IResourceManager>()), this.ResumeAfterFeedbackDialog, context.Activity.AsMessageActivity(), CancellationToken.None); 
} 

// Context.Forward works 
await context.Forward(new FeedbackDialog(FeedbackContext.CreateLead.ToString(), this.GetService<IResourceManager>()), this.ResumeAfterFeedbackDialog, context.Activity.AsMessageActivity(), CancellationToken.None); 
+0

Où/quand essayez-vous d'appeler stack.forward? Pourquoi ne pas utiliser context.forward? Veuillez élaborer un peu sur ce que vous essayez de faire. –

+0

Dans mon scénario, j'ai un type d'activité invoke, que je dois gérer séparément, c'est-à-dire en dehors d'un contexte de dialogue. À la fin, je veux appeler une boîte de dialogue pour gérer quelques autres choses. Comme je manipule l'activité d'invocation en dehors du contexte de dialogue, et j'ai besoin d'utiliser une boîte de dialogue pour la dernière opération, je dois soit obtenir le contexte de quelque part ou le faire par l'intermédiaire de DialogStack. – Ritesh

+0

Pouvez-vous simplement appeler Conversation.SendAsync (message,() => new FeedbackDialog()); ? –

Répondre

1

Il y a un exemple dans l'échantillon de AlarmBot qui fait quelque chose de similaire:

https://github.com/Microsoft/BotBuilder/blob/master/CSharp/Samples/AlarmBot/Models/ExternalEvent.cs

S'il vous plaît essayer quelque chose comme ceci:

Edit:

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity)) 
{ 
    var token = new CancellationToken(); 
    var botData = scope.Resolve<IBotData>(); 
    await botData.LoadAsync(token); 
    var task = scope.Resolve<IDialogTask>(); 

    var child = new TestDialog();       
    var interruption = child.Do(new ResumeAfterCall().ResumeAfter); 

    try 
    { 
     task.Call(interruption, null); 
     await task.PollAsync(token); 
    } 
    finally 
    { 
     await botData.FlushAsync(token); 
    } 
} 

     [Serializable] 
     public class ResumeAfterCall 
     { 
      public async Task<IMessageActivity> ResumeAfter(IBotContext context, IAwaitable<object> result) 
      { 
       return await result as IMessageActivity;     
      } 
     } 
+0

Merci pour votre réponse Eric. J'ai déjà vu cet échantillon. Cela ne m'aide pas beaucoup, d'abord je veux utiliser Forward et second le CV après que la méthode est spécifiée comme nulle, mais j'ai besoin d'avoir un CV après la méthode spécifiée ici. – Ritesh

+0

J'ai modifié ma réponse pour activer la méthode ResumeAfter. –