C# 为什么是上下文。在StartAsync中等待没有';不要停止对话

C# 为什么是上下文。在StartAsync中等待没有';不要停止对话,c#,botframework,C#,Botframework,我肯定这是个愚蠢的问题,但如果我不问,我会更愚蠢 我有以下代码 [Serializable] public class RootDialog : IDialog<object> { public async Task StartAsync(IDialogContext context) { await context.PostAsync("RootDialog !"); context.Wait(MessageReceived

我肯定这是个愚蠢的问题,但如果我不问,我会更愚蠢 我有以下代码

    [Serializable]
public class RootDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("RootDialog !");

        context.Wait(MessageReceivedAsync);
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;

        // calculate something for us to return
        int length = (activity.Text ?? string.Empty).Length;

        // return our reply to the user
        await context.PostAsync($"You sent {activity.Text} which was {length} characters");

        context.Wait(MessageReceivedAsync);
    }
}
[可序列化]
公共类RootDialog:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
wait context.PostAsync(“RootDialog!”);
Wait(MessageReceivedAsync);
}
专用异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
var活动=等待作为活动的结果;
//算点东西让我们回去
int length=(activity.Text??string.Empty).length;
//将我们的回复返回给用户
wait context.PostAsync($“您发送的{activity.Text}为{length}个字符”);
Wait(MessageReceivedAsync);
}
}
我理解语句上下文。Wait用于等待用户的下一条消息。 但是如果我启动我的RootDialog我的声明 wait context.PostAsync(“RootDialog!”); 是在我的陈述之后执行的 wait context.PostAsync($“您发送的{activity.Text}为{length}个字符”); 他也被处决了

为什么?

为什么我没有在程序中暂停语句 Wait(MessageReceivedAsync);
在StartAsync函数中,如我在MessageReceivedAsync函数中所做的那样?

有一些IDialogContext的描述。请在文档中等待:

StartAsync方法调用IDialogContext.Wait和continuation 委托以指定在创建新对象时应调用的方法 已收到消息(MessageReceivedAsync)

使用BotBuilderSDK构建的bot是restful和无状态的,因为服务器本身不跟踪或存储会话信息。“context.Wait(method)”不是指“冻结此处的代码”,而是指:下次用户发送消息时,在对话框中使用此方法继续。调用next的方法实际上是通过对话框序列化的,并存储在
状态服务中(请参见此处:用户下次在同一对话的上下文中发送消息时,将调用最后一个context.Wait(methodname))

例如:

[Serializable]
public class RootDialog : IDialog<object>
{
    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;

        // calculate something for us to return
        int length = (activity.Text ?? string.Empty).Length;

        // return our reply to the user
        await context.PostAsync($"You sent {activity.Text} which was {length} characters");


        context.Wait(MessageReceivedAsync2);
    }

    private async Task MessageReceivedAsync2(IDialogContext context, IAwaitable<object> result)
    {
        await context.PostAsync($"Second MessageReceived");

        context.Wait(MessageReceivedAsync);
    }
}
[可序列化]
公共类RootDialog:IDialog
{
公共任务StartSync(IDialogContext上下文)
{
Wait(MessageReceivedAsync);
返回Task.CompletedTask;
}
专用异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
var活动=等待作为活动的结果;
//算点东西让我们回去
int length=(activity.Text??string.Empty).length;
//将我们的回复返回给用户
wait context.PostAsync($“您发送的{activity.Text}为{length}个字符”);
Wait(MessageReceivedAsync2);
}
专用异步任务消息ReceivedAsync2(IDialogContext上下文,IAwaitable结果)
{
wait context.PostAsync($“Second MessageReceived”);
Wait(MessageReceivedAsync);
}
}
对于用户发送的每条消息,上述代码将在MessageReceivedAsync和MessageReceivedAsync2之间来回切换


你使用的是哪个版本的BotBuilder?你是如何创建/启动
RootDialog
?。顺便说一句,如果此对话框是与Conversation.SendAsync()一起启动的,并且发生在消息之后,那么你看到的行为就可以了。我使用的是我认为的最后一个版本。3.8.是的uséConversation.SendAsync