2017-09-21 4 views
2

Context.Forward를 사용하여 다른 대화 상자로 컨텍스트를 전달하려는 시나리오가 있으며 완벽하게 작동합니다. 이제 대화 상자 스택을 가져오고 DialogStack.Forward를 사용하도록 코드를 업데이트하면 Stack 예외가 발생합니다. 이 문제에 대한 모든 포인터는 높이 평가됩니다.DialogStack.Forward는 Context.Forward에서 작동하지 않습니다.

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

이런 식으로 뭔가를 시도하십시오 : 비슷한 않는 AlarmBot 샘플의 예입니다

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

/당신이 스택을 호출하려고합니까? 앞으로? 컨텍스트를 사용하지 않는 것이 좋습니다. 전달? 당신이하려고하는 것에 대해 좀 더 자세히 설명해주십시오. –

+0

필자의 시나리오에서는 Invoke Activity Type이 있는데, 이것은 별도로 처리해야합니다. 즉, 대화 상자 컨텍스트 외부에 있어야합니다. 결국에는 대화 상자를 호출하여 몇 가지 추가 정보를 처리하려고합니다. 내가 대화 컨텍스트 외부에서 invoke 활동을 처리하고 있으며 마지막 작업을 위해 대화 상자를 사용해야 할 필요가 있습니다. 대화 상자를 통해 어딘가에서 컨텍스트를 가져 오거나 DialogStack을 통해이 작업을 수행해야합니다. – Ritesh

+0

Conversation.SendAsync (message,() => new FeedbackDialog())를 호출 할 수 있습니까? ? –

답변

1

편집 :

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

답변 해 주셔서 감사합니다. Eric. 이미이 샘플을 보았습니다. 이것은 많이 도움이되지 않습니다. 먼저 Forward를 사용하고 메서드가 null로 지정된 후에 이력서를 다시 사용하려고합니다. 그러나 여기에 지정된 메서드 다음에 이력서가 있어야합니다. – Ritesh

+0

ResumeAfter 메서드를 제공 할 수 있도록 내 대답을 편집했습니다. –