首页 > 解决方案 > 不带参数的 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;
}

标签: botframeworkbots

解决方案


拉胡尔,这实际上是一个有点复杂的问题。我将尽我所能解释并指出您可以检查的代码,以便根据需要更深入地理解。

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 。


推荐阅读