【问题标题】:Bot Framework: Method exits after attempting to await valueBot Framework:方法在尝试等待值后退出
【发布时间】:2017-03-16 09:41:30
【问题描述】:

我似乎在使用 IAwaitable 时遇到了一些问题。我有以下对话框

[Serializable]
public class SearchDialog : IDialog<object>
{
    private SpotifyClient _client;

    public SearchDialog()
    {
        _client = new SpotifyClient();
    }

    public async Task StartAsync(IDialogContext context)
    {
        await context.PostAsync("Please enter the name of the artist");
        context.Wait<string>(MessageReceived);
    }

    public async Task MessageReceived(IDialogContext context, IAwaitable<string> activity)
    {
        var message = await activity;

        var results = await _client.SearchForArtistAsync(message);

        if(results != null && results.Artists.Results.Any())
        {
            var artists = results.Artists.Results.Select(x => x.Name); // List<string>

            PromptDialog.Choice(context,
                ChoiceSelectAsync,
                artists,
                string.Empty,
                "Didn't get that",
                3,
                PromptStyle.PerLine);
        }
    }

    public async Task ChoiceSelectAsync(IDialogContext context, IAwaitable<string> choice)
    {
        var chosenArtist = await choice;

        await context.PostAsync($"You have chosen {chosenArtist}");

        context.Wait<string>(ChoiceSelectAsync);
    }
}

问题是,提示对话框永远不会显示。 MessageReceived 方法似乎试图等待活动,但随后退出该方法。如果我使用 await 关键字,为什么它不等待结果?任何帮助将不胜感激。

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

    MessageReceived 方法的签名错误。它应该是 IAwaitable&lt;MessageActivity&gt; 而不是 IAwaitable&lt;string&gt;

    public async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> activity)
    

    完成此操作后,您还需要将context.Wait 调用更新为context.Wait(MessageReceived);

    然后,要访问用户发送的文本,只需检查等待消息的Text 属性:

      var message = await activity;
    
      var results = await _client.SearchForArtistAsync(message.Text);
    

    【讨论】:

    • 它可以是 IAwaitable 因为 context.wait 正在将字符串发布到 MessageReceived
    • 没有。在这种情况下,它需要是 IMessageActivity,因为用户消息被包装在 that 中。
    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多