【发布时间】: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