在没有用户活动的特定时间后取消对话框

时间:2017-03-11 15:32:38

标签: c# session task botframework

在用户没有任何活动和与bot的对话的特定时间之后,我有以下代码取消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中为每个用户停止运行任务?

1 个答案:

答案 0 :(得分:-1)

您只向Task.Run函数提供CancellationToken,该函数仅影响任务的开始,即该令牌仅用于确定在取消令牌时是否应中止任务启动。

Task.Run函数似乎没有任何功能,因为包含的代码已经是异步的,即等待Task.Run(innerMethodBlock)应该被直接执行“innerMethodBlock”替换。要中止实际代码,您需要在默认设置的地方(CancellationToken)中提供令牌(CancellationToken)等于CancellationToken.None。 “await Task.Delay(60000)”也应该被“await Task.Delay(60000,token)”替换,虽然我不知道你为什么要在开始初始化bot状态之前等待1分钟。 / p>

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