Как отменить диалог в фреймворке бота?

Я пытаюсь занять пользователя моего бота, ожидая особенно медленного api. Я перенаправляю пользователя в новый диалог и предоставляю токен отмены, чтобы отменить диалог, как только api вернет мой результат.

Я ожидал, что приведенный ниже код выйдет из stallUntilCompletedDialog, когда я вызову Cancel () для токена отмены.

public async Task ResumeAfterFirstDialog(IDialogContext context,
                                         IAwaitable<API.Models.Request> result)
{
    var requestData = await result;
    var response = new API.Models.Response();
    var cancellationToken = new CancellationTokenSource();

    Task.Run(async () =>
    {
        response = await _slowApi.CallApi(requestData, accessToken);

        cancellationToken.Cancel();
    });

    var stallUntilCompletedDialog = new StallUntilCompletedDialog<ApiResponse>();
    await context.Forward(stallUntilCompletedDialog, 
                          ResumeAfterCompletedDialog, 
                          result, 
                          cancellationToken.Token);
}

ResumeAfterCompletedDialog никогда не запускается, и я застрял в диалоговом окне зависания. Как я могу добиться, чтобы диалоговое окно закрывалось при ответе api, и как сделать ответ api доступным в моем ResumeAfterCompletedDialog?

ResumeAfterCompletedDialog never starts and I am stuck in the stalling dialog Выдает ли исключение?
Fei Han 13.08.2018 11:33

Никакого исключения. Я провел еще какое-то расследование, и, как мне кажется, происходит следующее. Task.Run создает новый экземпляр моего rootDialog, и поэтому все, что я делаю в блоке task.Run, не влияет на первый экземпляр, то есть на тот, который принадлежит основному потоку. Есть идеи, как мне запустить задачу, которая ждет ответа API, и в то же время развлечь пользователя еще одним диалогом?

Rufus1123 13.08.2018 13:35

Вместо вызова cancellationToken.Cancel() попробуйте вызвать Context.Done(true), истинное значение может варьироваться в зависимости от того, возвращаете ли вы что-то из своего диалога.

D4RKCIDE 13.08.2018 23:58

Проблема в том, что stallUntilCompletedDialog не знает, когда медленный api вернул значение. Поэтому я не знаю, когда вызывать context.Done () в новом диалоговом окне. Или вы говорите, что я могу вызвать context.Done () в Task.Run, и он остановит диалоговое окно с задержкой?

Rufus1123 14.08.2018 11:03

да, это будет проблемой. Вы не сможете сделать это таким образом, если вручную не удалите диалог остановки из стека. вы можете переосмыслить этот дизайн. Это может быть подходящим использованием для продолжения

D4RKCIDE 14.08.2018 21:51
0
5
575
0

Другие вопросы по теме