定时任务限制(或者任务持久化是如何实现的)?

Scheduled tasks limitations (or how tasks persistence is implemented)?

我已经开始阅读 Hangfire 文档,但没有发现任何关于任务限制的内容。

如声明的那样,任务(或作业)存储在某处。

由于它们只是委托,据我所知,唯一可以存储的是委托 "body"(IL?)。但是可能会有闭包,为任务提供一些上下文,例如,一些外部服务,可能需要将额外的程序集加载到 运行 他们的代码等

Hangfire 如何处理这个问题?
任务是否可以在其主体中包含任何指令,或者有任何限制?

似乎该机制基于 Expression 用于调度操作,并且该库主要用于 "internal"(进程中)执行,主要在 ASP.Net 网站。

意思是,执行预定操作所需的所有程序集都应该已经加载到 Web 应用程序内存中 space,因为它们是计划作业所必需的(如果应用程序不会编译,缺少未引用的程序集中的 Type)。

希望它能让事情更清楚一点!

当您创建一个作业时,它会调用 Job.FromExpression,如果您向它传递方法调用表达式以外的任何内容,它就会抛出异常。因此,您唯一可以传递给 BackgroundJob.Enqueue 的是一行调用函数的行。

然后序列化对象的类型,并使用 JobHelper.ToJson 将所有传入的参数传递给 JSON。当您传入 class 的实例时,该实例未被序列化,只有类型被序列化,如果执行跨越进程边界,它将丢失内部状态。

您可能想阅读旧 hangfire 博客网站上的博客文章“Are your methods ready to run in background?