2017-09-21 9 views
2

私はContext.Forwardを使って別のダイアログにコンテキストを転送したいというシナリオを持っています。今私はダイアログスタックをフェッチし、DialogStack.Forwardを使用するコードを更新すると、StackはEmpty例外になります。この問題へのポインタは非常に高く評価されます。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アクティビティを処理するので、最後の操作のためにダイアログを使用する必要があります。私はどこかからコンテキストを取得するか、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を使い、2回目の再開メソッドがnullとして指定された後に、ここで指定されたメソッドの後に再開が必要です。 – Ritesh

+0

ResumeAfterメソッドを提供できるように私の答えを編集しました。 –

関連する問題