无法在Azure Bot中全局声明Timer

1 c# timer botframework

我正在使用.NET Bot Builder v 3.15.2.2并在Bot Emulator v 3.5.36中测试它

我正在尝试应用一个计时器(非常类似于#837),在新的对话开始后,有一个10分钟的计时器来检查是否有任何不活动.一旦它已经失效,它将向对话发布消息,如果有人加入对话,它将停止计时器.我尝试了一种简单的方法,通过全局声明一个计时器并具有一个计时器回调.但是在我输入任何内容之前,我总是在模拟器中收到:"抱歉,我的机器人代码有问题".如果我将Timer作为全局变量删除,它运行正常.我知道对于我想要全局声明的类,它应该是可序列化的,但我不确定它如何适用于其他类似Timer.

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) {

     var message = await result;
     await SaveConversation(context, message);

     var timerCallBack = new TimerCallback(this.TimerEventCallback);
     this.botTimer = new Timer(timerCallBack, context, new TimeSpan(0, 10, 0).Milliseconds, new TimeSpan(0, 10, 0).Milliseconds);
    }


public void TimerEventCallback(object obj)
    {
         var context = (IDialogContext)obj;
        Activity reply = (Activity)context.Activity;

        ConnectorClient connector = new ConnectorClient(new System.Uri(reply.ServiceUrl));
        connector.Conversations.ReplyToActivityAsync(reply.CreateReply($"Conversation has been closed due to Inactivity")).Wait();
        this.botTimer.Dispose();
    }`
Run Code Online (Sandbox Code Playgroud)

Fei*_*Han 7

"对不起,我的机器人代码有问题"

如果您在Bot Emulator中检查错误日志,"Type 'System.Threading.Timer' in xxxxxxxx is not marked as serializable. "则抛出异常:导致问题.

在一个新的对话开始后,有一个10分钟的计时器来检查是否有任何不活动.一旦它已经失效,它将向对话发布消息,如果有人加入对话,它将停止计时器.

您可以尝试使用此方法来实现您的要求:从当前对话中收集一些信息并将其存储在Azure服务总线队列中的预定消息(指定ScheduledEnqueueTimeUtc属性)中,然后您可以使用服务总线队列触发的Azure功能或Azure WebJobs来处理队列消息并发送主动消息.

要停止为特定的预定消息发送主动消息,可以通过调用CancelScheduledMessageAsync(sequenceNumber)方法取消该特定的预定消息.