【发布时间】:2016-07-08 07:09:43
【问题描述】:
我已经开始阅读 Hangfire 文档,但没有发现任何关于任务限制的信息。
正如声明的那样,任务(或作业)存储在某处。
由于它们只是代表,据我所知,唯一可以存储的是代表“主体”(IL?)。但是可能会有闭包,为任务提供一些上下文,例如,一些外部服务,可能需要加载额外的程序集来运行它们的代码等。
Hangfire 如何处理这个问题?
任务可以在其主体中包含任何指令,还是有任何限制?
【问题讨论】:
我已经开始阅读 Hangfire 文档,但没有发现任何关于任务限制的信息。
正如声明的那样,任务(或作业)存储在某处。
由于它们只是代表,据我所知,唯一可以存储的是代表“主体”(IL?)。但是可能会有闭包,为任务提供一些上下文,例如,一些外部服务,可能需要加载额外的程序集来运行它们的代码等。
Hangfire 如何处理这个问题?
任务可以在其主体中包含任何指令,还是有任何限制?
【问题讨论】:
当您创建一个调用Job.FromExpression 的作业时,如果您传递给它的不是方法调用表达式,它就会引发异常。因此,您可以传递给BackgroundJob.Enqueue 的唯一内容是该行调用函数的单行。
然后它会序列化对象的类型,并使用JobHelper.ToJson 将所有参数传入 JSON。当你传入一个类的实例时,该实例没有被序列化,只有类型被序列化,如果执行跨越进程边界,它将失去内部状态。
您可能想阅读旧hangfire 博客网站“Are your methods ready to run in background?”上的博客文章
【讨论】:
似乎该机制基于Expression 用于调度操作,并且该库主要用于 ASP.Net 网站中的“内部”(进程中)执行。
意思是,执行计划操作所需的所有程序集都应该已经加载到 Web 应用程序的内存空间中,因为它们是计划作业所必需的(如果缺少 Type,应用程序将不会编译来自未引用的程序集)。
希望它能让事情更清楚一点!
【讨论】: