【问题标题】:Cancel a dialog after a specific time of no user activity在没有用户活动的特定时间后取消对话框
【发布时间】:2017-08-01 21:33:30
【问题描述】:

在用户没有任何活动和与机器人对话的特定时间之后,我有以下代码来取消 botframework 中的对话框。我已经存储了取消令牌并尝试从用户数据中加载。

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        try
        {
            // load and store the cancellation token
            StateClient stateClient = activity.GetStateClient();
            BotData userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
            if (userData.GetProperty<CancellationTokenSource>("TokenSource") == null)
            {
                userData.SetProperty("TokenSource", new CancellationTokenSource());
                await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);
            }
            else
            {
                // cancel task here
                var token = userData.GetProperty<CancellationTokenSource>("TokenSource");
                token.Cancel();
                userData.SetProperty("TokenSource", new CancellationTokenSource());
                await stateClient.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);
            }
            userData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
            var source = userData.GetProperty<CancellationTokenSource>("TokenSource");

            // start task
            Task.Run(async () =>
            {
                await Task.Delay(60000);
                // reset the dialog states
                using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
                {
                    var botData = scope.Resolve<IBotData>();
                    await botData.LoadAsync(default(CancellationToken));
                    var stack = scope.Resolve<IDialogStack>();
                    stack.Reset();
                    await botData.FlushAsync(default(CancellationToken));
                }
            }, source.Token);
        }
        catch(Exception) { throw;}
    }
}

问题是已运行的任务无法再停止。 因此,问题是如何停止 botframework 中的运行任务(针对每个用户)?

【问题讨论】:

  • 您能否检查一下这个code,我想这可能会对您有所帮助。
  • @Jyo 你能引用一个特定的文件吗?我在那里找不到任何相关代码。

标签: c# session task botframework


【解决方案1】:

你只给Task.Run函数提供了CancellationToken,它只影响任务的启动,即token只用于确定token取消时是否应该中止任务启动。

Task.Run 函数似乎没有任何功能,因为包含的代码已经是异步的,即 await Task.Run(innerMethodBlock) 应该被替换为直接执行“innerMethodBlock”。要中止实际代码,您需要在您编写 default(CancellationToken) 的地方提供令牌,因为 default(CancellationToken) 等于 CancellationToken.None。此外,“await Task.Delay(60000)”也应替换为“await Task.Delay(60000, token)”,尽管我不知道您为什么要在开始初始化机器人状态之前等待 1 分钟。

catch(异常) { throw; } 也是没有函数的不必要代码。

【讨论】:

  • 之前所有的事情都已经完成了。这些都不是我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多