Сообщения не задерживаются в Botframework - PullRequest
0 голосов
/ 04 мая 2018

Я отправляю пользователю два сообщения в качестве ответа, как показано ниже,

static Timer t = new Timer(new TimerCallback(TimerEvent));
static Timer t1 = new Timer(new TimerCallback(TimerEventInActivity));
static int timeOut = Convert.ToInt32(ConfigurationManager.AppSettings["disableEndConversationTimer"]); //3600000

public static void CallTimer(int due) {
  t.Change(due, Timeout.Infinite);
}

public static void CallTimerInActivity(int due) {
  t1.Change(due, Timeout.Infinite);
}

public async static Task PostAsyncWithDelay(this IDialogContext ob, string text) {
  try {
    var message = ob.MakeMessage();
    message.Type = Microsoft.Bot.Connector.ActivityTypes.Message;
    message.Text = text;
    await PostAsyncWithDelay(ob, message);

    CallTimer(300000);

    if ("true".Equals(ConfigurationManager.AppSettings["disableEndConversation"])) {
      CallTimerInActivity(timeOut);
    }

  } catch (Exception ex) {
    Trace.TraceInformation(ex.Message);
  }

}

await context.PostAsyncWithDelay("Great!");
await context.PostAsyncWithDelay("I can help you with that.");

Но между ними нет задержки при получении. Оба сообщения принимаются за один раз.

Как я могу задержать второе сообщение через некоторое время?

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

In Root Dialog

Чтобы задержать ваше сообщение, вы можете использовать метод Task.Delay. Измените свой PostAsyncWithDelay на:

public async static Task PostAsyncWithDelay(IDialogContext context, string text)
{
        await Task.Delay(4000).ContinueWith(t =>
        {
            var message = context.MakeMessage();
            message.Text = text;
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
            {
                var client = scope.Resolve<IConnectorClient>();
                client.Conversations.ReplyToActivityAsync((Activity)message);
            }

        });
}

Вы можете вызвать метод PostAsyncWithDelay, если хотите задержать сообщение, в противном случае используйте метод context.PostAsync для отправки ваших сообщений.

  private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
  {
          //Sending a message nomally
          await context.PostAsync("Hi");

          //Notify the user that the bot is typing
          var typing = context.MakeMessage();
          typing.Type = ActivityTypes.Typing;
          await context.PostAsync(typing);

          //The message you want to delay. 
          //NOTE: Do not use context.PostAsyncWithDelay instead simply call the method.
          await PostAsyncWithDelay(context, "2nd Hi");
  }

OUTPUT

Here is what you get

0 голосов
/ 11 мая 2018

Чтобы задержать все ответы, вы можете вставить это прямо в контроллер.

       if (activity.Type == ActivityTypes.Message)
        {
            var connector = new ConnectorClient(new Uri(activity.ServiceUrl));
            Activity isTypingReply = activity.CreateReply();
            isTypingReply.Type = ActivityTypes.Typing;
            await connector.Conversations.ReplyToActivityAsync(isTypingReply);

            var message = isTypingReply;
            await Task.Delay(4000).ContinueWith(t =>
            {
                using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
                {

                }

            });


            await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
        }
0 голосов
/ 07 мая 2018

Как я могу задержать второе сообщение через некоторое время?

Если вы хотите отложить отправку второго сообщения, попробуйте следующий фрагмент кода:

await context.PostAsync($"You sent {activity.Text} at {DateTime.Now}");

Task.Delay(5000).ContinueWith(t =>
{
    using (var scope = Microsoft.Bot.Builder.Dialogs.Internals.DialogModule.BeginLifetimeScope(Conversation.Container, activity))
    {
        var client = scope.Resolve<IConnectorClient>();
        Activity reply = activity.CreateReply($"I can help you with that..");
        client.Conversations.ReplyToActivityAsync(reply);
    }
});

context.Wait(MessageReceivedAsync);

Кроме того, как уже упоминалось в комментариях, метод PostAsyncWithDelay кажется не встроенным в Bot Builder SDK. Если вы попытаетесь выполнить требование и определите этот пользовательский метод, вы можете опубликовать код этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...