2017-03-15 9 views
0

私はIAwaitableにいくつかの問題があるようです。次のダイアログが表示されますBotフレームワーク:値を待ってからメソッドが終了する

[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キーワードを使用している場合、結果を待っていないのですか?どんな助けでも大歓迎です。

答えて

0

MessageReceivedメソッドの署名が間違っています。それは、あなただけのTextプロパティをチェックするユーザーが送信したテキストにアクセスするために、またその後context.Wait(MessageReceived);

からcontext.Wait呼び出しを更新する必要があることをやった後IAwaitable<MessageActivity>代わりIAwaitable<string>

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

である必要があります待ちメッセージ:

var message = await activity; 

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

context.waitこの場合MessageReceived – Satheesh

+0

号に文字列を転記されるようにそれがIAwaitable することができユーザーメッセージがそのメッセージにラップされるため、IMessageActivityである必要があります。 –

関連する問題