无法理解为什么消息不需要参数

时间:2017-03-08 12:16:02

标签: c# async-await

我在c#中表现不佳。但我试图理解这个关于BOT框架的代码。这是方法

namespace HotelBot.Dialogs
{
[Serializable]
public class GreetingDialog : IDialog
{

    public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("I am kiran");
        context.Wait(MessageRecievedAsync);

    }

    public virtual async Task MessageRecievedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {
        var message = await argument;
        var userName = string.Empty;

        context.UserData.TryGetValue<string>("Name", out userName);

        if (string.IsNullOrEmpty(userName))
        {
            await context.PostAsync("What is your name");
            userName = message.Text;
            context.UserData.SetValue<string>("Name", userName);
        }
        else
        {
            await context.PostAsync(string.Format("Hi {0}. How can i help u?" + userName));
        }

        context.Wait(MessageRecievedAsync);

    }
}
}

代码中的这一行调用该方法

context.Wait(MessageRecievedAsync); // why no parameters are required

我想知道为什么该函数不需要传递参数?

1 个答案:

答案 0 :(得分:3)

它不需要参数的原因是Wait的方法签名看起来像

void Wait<R>(ResumeAfter<R> resume)

ResumeAfter<R>定义为

delegate Task ResumeAfter<in T> (IDialogContext context, IAwaitable<T> result)

所以这是一个代表。对于代理人,您可以在不包含指定类型的地方进行简写。你称之为真实的东西是

context.Wait(new ResumeAfter<IMessageActivity>(MessageRecievedAsync));

创建的内容传递对MessageRecievedAsync的引用,并让Wait调用其中的函数。如果你熟悉lambda表达式,你可以用另一种方式写出:

context.Wait((IDialogContext context, IAwaitable<IMessageActivity> result) => MessageRecievedAsync(context, result));