计划任务限制(或如何实现任务持久性)?
我已经开始阅读Hangfire文档,但没有发现任务限制。
正如声明的那样,任务(或作业)存储在某处。
因为他们只是代表,所以唯一可以存储,据我所知,是一个代表“身体”(IL?)。 但是可能存在闭包,它为任务提供了一些上下文,例如,一些外部服务,可能需要加载额外的程序集来运行它们的代码等。
Hangfire如何处理这个问题?
任务可以包含其正文中的任何说明,还是有任何限制?
创建作业时,它调用Job.FromExpression
,如果您传递除方法调用表达式之外的任何内容,则会抛出exception。 因此,您可以传递给BackgroundJob.Enqueue
的唯一内容是该行调用函数的单行。
然后,它使用JobHelper.ToJson
将它们的对象类型序列化,并将所有参数传入JSON。 传入类的实例时,实例未被序列化,只有类型是,如果执行跨过进程边界,它将失去内部状态。
您可能想阅读旧的hangfire博客网站上的博客文章“ 你的方法准备好在后台运行吗? ”
似乎该机制基于Expression
进行调度操作,该库主要用于ASP.Net网站中的“内部”(进程中)执行。
这意味着,执行调度操作所需的所有程序集都应该已经加载到Web应用程序内存空间中,因为需要它们来安排作业(如果应用程序缺少来自程序集的Type
,则应用程序将不会编译没有参考)。
希望它能让事情变得更加清晰!