在 C# botframework 中创建循环
Creating a loop in a C# botframework
我正在设计一个查询数据库的机器人,但是我碰壁了。
[LuisIntent("ProjectInfo")]
public async Task projectInfo(IDialogContext context, LuisResult result)
{
PromptDialog.Text(context,AfterPromptMethod,"Please enter your project name", attempts: 100);
}
async Task AfterPromptMethod(IDialogContext context, IAwaitable<string> userInput)
{
var InputText = await userInput;
string projectName = InputText.ToString();
if (projectName!= null)
{
TestInfo MI = new TestInfo();
if (MI.FindProject(projectName) == 0)
{
await context.PostAsync($"Project Found. What do you want to know ?");
}
else
{
//PromptDialog.Text(context,AfterPromptMethod,"Pleaase check your product name and try again", attempts: 100);
await context.PostAsync($"Project Not Found. Check your project name and try again.");
}
}
context.Wait(MessageReceived);
}
这是我想放置循环的地方,projectInfo 可以正常调用,但是当它到达找不到项目的 if 语句时,它什么也不做。我试过插入 "context.Wait(projectInfo)" 但没有用。我还尝试使用提示对话框,如果是,则返回主菜单。但是我一直无法理解这种方法。
有没有人有任何建议或更好的方法?
问题是context.Wait(..)
。当点击 PromptDialog
时,会创建一个不同的对话框,该对话框将处理提示。但是这个方法中的代码执行不只是在那里退出。它继续到方法的末尾,接下来它遇到的是 context.wait(MessageRecieved)
。此行试图指定应在 MessageRecieved 方法中处理下一条消息。所以你有 2 个地方是下一条消息应该去的地方,但那不可能。
要解决您的问题,请在 PromptDialog 后直接添加一个 return;
。这将确保 context.wait(..) 未被命中。
如果您想再次转到 projectInfo 方法,那么只需调用它:)
我更新了你的代码
[LuisIntent("ProjectInfo")]
public async Task projectInfo(IDialogContext context, LuisResult result)
{
PromptDialog.Text(context,AfterPromptMethod,"Please enter your project name", attempts: 100);
}
async Task AfterPromptMethod(IDialogContext context, IAwaitable<string> userInput)
{
var InputText = await userInput;
string projectName = InputText.ToString();
if (projectName!= null)
{
TestInfo MI = new TestInfo();
if (MI.FindProject(projectName) == 0)
{
await context.PostAsync($"Project Found. What do you want to know ?");
context.Wait(MessageReceived);
}
else
{
await context.PostAsync($"Project Not Found. Check your project name and try again.");
await this.projectInfo(context, null);
}
}
}
我正在设计一个查询数据库的机器人,但是我碰壁了。
[LuisIntent("ProjectInfo")]
public async Task projectInfo(IDialogContext context, LuisResult result)
{
PromptDialog.Text(context,AfterPromptMethod,"Please enter your project name", attempts: 100);
}
async Task AfterPromptMethod(IDialogContext context, IAwaitable<string> userInput)
{
var InputText = await userInput;
string projectName = InputText.ToString();
if (projectName!= null)
{
TestInfo MI = new TestInfo();
if (MI.FindProject(projectName) == 0)
{
await context.PostAsync($"Project Found. What do you want to know ?");
}
else
{
//PromptDialog.Text(context,AfterPromptMethod,"Pleaase check your product name and try again", attempts: 100);
await context.PostAsync($"Project Not Found. Check your project name and try again.");
}
}
context.Wait(MessageReceived);
}
这是我想放置循环的地方,projectInfo 可以正常调用,但是当它到达找不到项目的 if 语句时,它什么也不做。我试过插入 "context.Wait(projectInfo)" 但没有用。我还尝试使用提示对话框,如果是,则返回主菜单。但是我一直无法理解这种方法。
有没有人有任何建议或更好的方法?
问题是context.Wait(..)
。当点击 PromptDialog
时,会创建一个不同的对话框,该对话框将处理提示。但是这个方法中的代码执行不只是在那里退出。它继续到方法的末尾,接下来它遇到的是 context.wait(MessageRecieved)
。此行试图指定应在 MessageRecieved 方法中处理下一条消息。所以你有 2 个地方是下一条消息应该去的地方,但那不可能。
要解决您的问题,请在 PromptDialog 后直接添加一个 return;
。这将确保 context.wait(..) 未被命中。
如果您想再次转到 projectInfo 方法,那么只需调用它:)
我更新了你的代码
[LuisIntent("ProjectInfo")]
public async Task projectInfo(IDialogContext context, LuisResult result)
{
PromptDialog.Text(context,AfterPromptMethod,"Please enter your project name", attempts: 100);
}
async Task AfterPromptMethod(IDialogContext context, IAwaitable<string> userInput)
{
var InputText = await userInput;
string projectName = InputText.ToString();
if (projectName!= null)
{
TestInfo MI = new TestInfo();
if (MI.FindProject(projectName) == 0)
{
await context.PostAsync($"Project Found. What do you want to know ?");
context.Wait(MessageReceived);
}
else
{
await context.PostAsync($"Project Not Found. Check your project name and try again.");
await this.projectInfo(context, null);
}
}
}