2016-12-01 12 views
1

У меня есть бот с «корневым» диалогом, который работает дочерние диалоговые окна с помощью context.Call() или context.Forward() в зависимости от выбора пользователя, например, так:Ошибка платформы Bot при выполнении context.Wait(): значение не может быть нулевым. Имя параметра: ждать

context.Call(new QuestionsDialog(), ChildDialogComplete); 

После диалога выходов ребенка, то управление передается к этому методу, ChildDialogComplete. Он выводит приглашение и ждет ответа пользователя.

public async Task ChildDialogComplete(IDialogContext context, IAwaitable<object> argument) 
    { 
     var unnecessaryTemp = await argument; 
     var restartPrompt = context.MakeMessage(); 
     restartPrompt.Text = "Say \"hi\" again if I can help with anything else!"; 
     await context.PostAsync(restartPrompt); 
     context.Wait(MainScreenSelectionReceived); 
    } 

При отладке, последняя строка метода с context.Wait() причинами этого исключения в эмуляторе:

Исключение: System.ArgumentNullException: Значение не может быть пустым. Имя параметра: ждать на Microsoft.Bot.Builder.Internals.Fibers.Fiber1.-PollAsync> d__13.MoveNext()

--- Конец трассировки стека из предыдущего места, где был брошен исключение ---

в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в Microsoft.Bot.Builder.Internals.Fibers.Wait 2.Microsoft.Bot.Builder.Internals.Fibers.IAwaiter.GetResult() в Microsoft.Bot.Builder.Dialogs .Chain.LoopDialog1.d__3.MoveNext()

--- Конец трассировки стека из предыдущего места, где был брошен исключение ---

... и т. Д.

Эта ошибка не возникает, когда ChildDialogComplete запускается «естественно» при выходе из диалогового окна. Это происходит только тогда, когда я пытаюсь вызвать этот метод вручную, из другой части диалога корня, например:

ChildDialogComplete(context, argument); 

Где context и argument являются двумя стандартными параметрами методов в IDialog (IDialogContext context, IAwaitable<IMessageActivity> argument).

argument был ранее await ed перед передачей методу. Но я предполагаю, что это не проблема, поскольку исключение происходит на линии context.Wait(), которая кажется не связанной с IAwaitable.

ответ

1

Вы не можете передать ожидаемое значение методу, ожидающему IAwaitable<T>. Кроме того, вы будете ждать дважды в аргументе, если это так (один перед вызовом метода и другой внутри метода).

Рефакторинг вашего кода для извлечения всей логики внутри метода ChildDialogComplete, чтобы вы получили два методы, один получает IAwaitable<T>, а другой - только значение. Тот, кто получает IAwaitable, должен ждать аргумента и вызвать новый метод.

Однако вы не используете аргумент в этом методе, поэтому, если это будет так; Вам не нужно реорганизовать, и вы могли бы просто назвать ChildDialogComplete с null для параметра IAwaitable<T> после удаления await argument вызова вашего метода

ChildDialogComplete(context, null); 
+0

Эй, может помочь мне с этой частью кода Первый: https: // pastebin.com/eqV0F8wn, второй: https://pastebin.com/WVLjG24i.Я столкнулся с двумя ошибками, пытаясь изменить ожидания и попробовать другие комбинации. «Идентификатор активности не может быть Null» и «Значение не может быть пустым. Имя параметра: wait». Можете ли вы PLZ помочь –

+0

задать вопрос. –

+0

Та же проблема, о которой говорилось выше. thats y я прокомментировал здесь, –

 Смежные вопросы

  • Нет связанных вопросов^_^