0

我有一个 SF actor 服务,其工作原理大致如下:

  1. RunAsync服务中启动时,会创建一组预定义的参与者,并通过调用一个空StartAsync方法(在IActor- 派生的自定义接口上定义)来激活所有参与者。
  2. 每个参与者都会覆盖OnActivateAsync它注册提醒的地方,dueTime并且period都设置为 10 秒。
  3. 参与者在IRemindable.ReceiveReminderAsync实现中完成所有工作。这项工作通常很快(约 100 毫秒),但有时可能会持续几分钟(我知道这是糟糕的设计,请不要对此发表评论:-))。

我的问题是:当提醒到期时会发生什么,但演员仍然执行之前的回调代码?

根据文档,回调是排队的,但我也想知道队列是否以某种方式受到限制以及达到限制时会发生什么?

感谢您的反馈意见!

帕洛

4

1 回答 1

1

我浏览了 SF Actors 框架源代码 ( ActorReminder.cs) 并找到了答案(感谢开源的美丽 :-):

当提醒到期时会发生什么,但参与者仍然执行之前的回调代码?

实际上,这永远不会发生。原因是ActorReminder该类使用System.Threading.Timer类来触发提醒,方法是使用其参数的Change方法重载。这意味着您的提醒回调可以执行几个小时,SF 会很高兴地等待它完成而不会抱怨。提醒回调完成后,将在您注册提醒时指定的到期时间“重新启动”计时器。Timeout.InfiniteTimeSpanperiodActorReminder

这也意味着没有排队提醒回调之类的东西,这显然回答了我的第二个问题:-)。

于 2020-11-27T14:38:51.787 回答