我对调用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;
}
答案 0 :(得分:2)
拉胡尔, 这实际上是一个有点复杂的问题。我将尽力解释,并指出您可以检查的代码,以便在需要时加深了解。
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的结果。参数的值由bot框架定义和设置。 我希望这可以使您更好地了解使用MS bot进行的幕后工作。 该代码全部包含在Microsoft's BotBuilder source的GitHub上 我引用的特定代码文件是位于here的IDialogContext.cs。