我开始阅读 Hangfire 文档,但没有发现任何有关任务限制的信息。
正如声明的那样,任务(或作业)存储在某个地方。
由于它们只是代表,据我所知,唯一可以存储的东西是代表“主体”(IL?)。但是可能存在闭包,它为任务提供了一些上下文,例如一些外部服务,可能需要加载额外的程序集来运行其代码等。
Hangfire 如何处理这个问题?
任务的主体中可以包含任何指令吗?或者有任何限制吗?
当您创建作业时,它会调用Job.FromExpression https://github.com/HangfireIO/Hangfire/blob/a5761072f18ff4caa80910cda4652970cf52e693/src/Hangfire.Core/Common/Job.cs#L233,如果您向它传递除方法调用表达式之外的任何内容,它将引发异常。所以你唯一可以传递的东西BackgroundJob.Enqueue
是一行,该行调用一个函数。
然后,它将对象的类型和所有传入的参数序列化为 JSON,使用JobHelper.ToJson https://github.com/HangfireIO/Hangfire/blob/a5761072f18ff4caa80910cda4652970cf52e693/src/Hangfire.Core/Common/JobHelper.cs#L33。当您传入类的实例时,该实例不会被序列化,只有类型会被序列化,如果执行跨越进程边界,它将丢失内部状态。
您可能想阅读旧的 Hangfire 博客网站上的博客文章“您的方法准备好在后台运行了吗? http://odinserj.net/2014/05/10/are-your-methods-ready-to-run-in-background/"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)