botframework - 不带参数的 MessageReceivedAsync 调用
问题描述
我有一个关于调用 MessageReceivedAsync 的非常基本的问题。我知道这个方法是从 context.Wait 调用的。但是,我想澄清的是如何在不传递任何参数的情况下调用函数。方法定义有 2 个参数。
public Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
return Task.CompletedTask;
}
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
var activity = await result as Activity;
}
解决方案
拉胡尔,这实际上是一个有点复杂的问题。我将尽我所能解释并指出您可以检查的代码,以便根据需要更深入地理解。
context.Wait(MessageReceivedAsync) 正在调用 IDialogContext 的 Wait 方法,该方法定义为..
public static void Wait(this IDialogStack stack, ResumeAfter<IMessageActivity> resume)
如您所见,这是 IDialogStack 的扩展方法。这里要看到的重要一点是第二个参数 ResumeAfter。ResumeAfter 是等待事件发生时要做什么的委托,通常是有人向您的机器人键入新消息。
好的,现在我们可以看一下委托 ResumeAfter 的定义。它被定义为...
public delegate Task ResumeAfter<in T>(IDialogContext context, IAwaitable<T> result);
这就是你的答案。MessageReceivedAsync 的参数是委托 ResumeAfter 的结果。参数的值由机器人框架定义和设置。我希望这能让您更好地了解 MS 机器人在幕后发生的事情。此代码全部包含在Microsoft 的 BotBuilder 源中的 GitHub 上。 我引用的特定代码文件是位于此处的 IDialogContext.cs 。
推荐阅读
- r - 如何删除文档Rmarkdown中标题中的数字页?
- flutter - 颤振/飞镖内存对象缓存?
- if-statement - 在制定用户名创建时获得循环依赖警告
- regex - 正则表达式:如果第一个字母是 X,它应该以 A 或 B 结尾。我该怎么做?
- blazor - Blazor 自定义重新加载/连接丢失文本
- java - 无法放置墙标或编辑其文本
- sql-server - 比较两个表并仅返回具有不同值的行-根据建议编辑谢谢
- dialogflow-es - Google Dialogflow 是否支持视频?
- d3.js - 使用 d3 力(画布)附加新顶点和边时如何保持绘制顶点的位置?
- node.js - NodeJS Firebase 功能在部署后失败