在用户没有任何活动和与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中为每个用户停止运行任务?
答案 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;没有函数也是不必要的代码。