是否可以检测代码是否作为 C# 中的 Hangfire 作业运行? 谢谢你
我希望存在一些全局系统变量,并指示代码正在作为hangfire作业的一部分运行。
我希望存在一些全局系统变量并表明 代码作为hangfire 作业的一部分运行。
我对你的用例很好奇。在我看来,显式依赖于执行上下文的代码更难以维护和测试。 是不是因为你的代码依赖于 HttpContext,而在使用 Hangfire 运行任务时,HttpContext 不可用?
无论如何,你可以使用 AsyncLocal 和 Hangfire ServerFilters 实现你想要的
public static class HangfireTaskMonitor
{
public static AsyncLocal<bool> IsRunningInBackground { get; } = new AsyncLocal<bool>();
}
public class ContextTrackedAttribute : JobFilterAttribute, IServerFilter
{
public void OnPerforming(PerformingContext filterContext)
{
HangfireTaskMonitor.IsRunningInBackground.Value = true;
}
public void OnPerformed(PerformedContext filterContext)
{
HangfireTaskMonitor.IsRunningInBackground.Value = false;
}
}
然后将
[ContextTracked]
属性放在您的作业方法上,并随时测试 HangfireTaskMonitor.IsRunningInBackground.Value
。
为了清晰起见,这个想法被稍微简化了。对于更加解耦的解决方案,我会将 HangfireTaskMonitor 作为单例而不是静态类注入;让过滤器成为在 Hangfire 配置中声明的简单过滤器,而不是属性。
您可以注册作用域实例并使用我在此处解释的类似示例来初始化它们: https://stackoverflow.com/a/77201586/13845498
在您的情况下,只需在 Hook 中注入作用域实例,使用 JobId 等一些值对其进行初始化,然后将该实例注入到您的类中。您可以检查 JobId 值以确保它正在 Hangfire 范围内运行。