Microsoft Bot Framework - InvalidNeedException,预期调用,等待
Microsoft Bot Framework - InvalidNeedException, expected Call, have Wait
我的机器人项目中出现 InvalidNeedException,但我无法理解该异常的确切含义。
Microsoft.Bot.Builder.Internals.Fibers.InvalidNeedException occurred
HResult=-2146233079
Message=invalid need: expected Call, have Wait
Source=Microsoft.Bot.Builder
StackTrace:
at Microsoft.Bot.Builder.Internals.Fibers.Frame`1.Microsoft.Bot.Builder.Internals.Fibers.IWaiter<C>.NextWait[T]()
InnerException:
以下方法都属于同一个Dialogclass
[LuisIntent("Test")]
public async Task GetReleaseTickets(IDialogContext context, LuisResult result)
{
await ProcessEntities(context, result.Entities);
await context.PostAsync("done");
context.Wait(MessageReceived);
}
private async Task ProcessEntities(IDialogContext context, IList<EntityRecommendation> entities) {
context.Wait<bool>(ProcessX);
context.Wait<bool>(ProcessY); // exception thrown here
}
在哪里
public async Task ProcessX(IDialogContext context, IAwaitable<bool> argument) {
//do X
context.Done();
}
public async Task ProcessY(IDialogContext context, IAwaitable<bool> argument) {
//do Y
context.Done();
}
看来我不能连续两次调用 context.Wait,但我不确定调用两个异步方法的推荐方法是什么,并且想了解“预期呼叫,等待”要我做。我不想在那行调用 context.Call,只需确保该方法异步完成即可。
不确定您要实现的目标,但通过查看代码,我认为:
- 您不需要在 ProcessX/Y 方法中执行 Context.Wait。 context.Wait是等待消息出现,执行传递过来的continuation delegate。
- Context.Done用于'complete'/'quit'当前对话框,return一个结果给调用对话框,从对话框栈中弹出当前对话框。但根据您的代码,您似乎想继续在 LUIS 对话框中侦听消息,因此我也将删除这些消息。
我的机器人项目中出现 InvalidNeedException,但我无法理解该异常的确切含义。
Microsoft.Bot.Builder.Internals.Fibers.InvalidNeedException occurred
HResult=-2146233079
Message=invalid need: expected Call, have Wait
Source=Microsoft.Bot.Builder
StackTrace:
at Microsoft.Bot.Builder.Internals.Fibers.Frame`1.Microsoft.Bot.Builder.Internals.Fibers.IWaiter<C>.NextWait[T]()
InnerException:
以下方法都属于同一个Dialogclass
[LuisIntent("Test")]
public async Task GetReleaseTickets(IDialogContext context, LuisResult result)
{
await ProcessEntities(context, result.Entities);
await context.PostAsync("done");
context.Wait(MessageReceived);
}
private async Task ProcessEntities(IDialogContext context, IList<EntityRecommendation> entities) {
context.Wait<bool>(ProcessX);
context.Wait<bool>(ProcessY); // exception thrown here
}
在哪里
public async Task ProcessX(IDialogContext context, IAwaitable<bool> argument) {
//do X
context.Done();
}
public async Task ProcessY(IDialogContext context, IAwaitable<bool> argument) {
//do Y
context.Done();
}
看来我不能连续两次调用 context.Wait,但我不确定调用两个异步方法的推荐方法是什么,并且想了解“预期呼叫,等待”要我做。我不想在那行调用 context.Call,只需确保该方法异步完成即可。
不确定您要实现的目标,但通过查看代码,我认为:
- 您不需要在 ProcessX/Y 方法中执行 Context.Wait。 context.Wait是等待消息出现,执行传递过来的continuation delegate。
- Context.Done用于'complete'/'quit'当前对话框,return一个结果给调用对话框,从对话框栈中弹出当前对话框。但根据您的代码,您似乎想继续在 LUIS 对话框中侦听消息,因此我也将删除这些消息。