ダイアログの BeginDialogAsync
や EndDialogAsync
をオーバーライドすると、ダイアログの最初と最後に処理をさしこめるっぽい。
でも、ダイアログの外側(Botクラス)からダイアログの状態を見て全てのダイアログが終わったタイミングで何かメッセージを送りたいといった場合は DialogState の DialogStack に現在のダイアログの状態が入ってるみたいなので、そこがからっぽだとダイアログの処理が綺麗に終わったということで、Bot クラスの OnMessageActivityAsync に以下のような処理を書くと Bot クラス側でダイアログがつつがなく全部終わった後に何かすることが出来そうです。
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { // Run the Dialog with the new message Activity. var accessor = ConversationState.CreateProperty<DialogState>(nameof(DialogState)); await Dialog.RunAsync(turnContext, accessor, cancellationToken); var state = await accessor.GetAsync(turnContext); if (!state.DialogStack.Any()) { // ダイアログが全部終わってるときの処理 } }
正攻法が他にあったら教えて。