gpt4 book ai didi

c# - Hangfire 在作业中使用变量

转载 作者:行者123 更新时间:2023-11-30 21:26:25 24 4
gpt4 key购买 nike

我知道 hangfire 不在与 ASP.NET 相同的上下文中运行,它有自己的线程池,但我应该在我的后台作业中使用变量。这是可以理解的,因为事实上,这些作业可能不会在同一台服务器上运行。这意味着如果我执行 _locked = false;(在 Checker() 中),它将永远不会被应用,因为它在另一个上下文中运行。 BackgroundJob.Enqueue(() => Start(bot)); 也是一样,如果它是一个循环作业(cron 作业),我在内部使用的那些变量将始终在每一个 cron 作业都会弹出。

在这种情况下如何使用变量?

private UpdateSubscription _subscription;

private StringBuilder _sb = new StringBuilder();
private bool _locked = false;

public void RunStart(Bot bot)
{
BackgroundJob.Enqueue(() => Start(bot));
}

public void Start(Bot bot)
{
ApplyCredentialsOnClient();

var lastKnownKline = _client.GetKlines(bot.CryptoPair.Symbol, bot.TimeInterval.Interval, limit: 2).Data.First();
_subscription = _socketClient.SubscribeToKlineUpdates(bot.CryptoPair.Symbol, bot.TimeInterval.Interval, async data =>
{
if (data.Data.Final)
{
_logger.LogError($"Final | Open time: {data.Data.OpenTime.ToLocalTime()}");
}

if (lastKnownKline.OpenTime != data.Data.OpenTime)
{
// Static
_logger.LogError($"Static | Open time: {lastKnownKline.OpenTime.ToLocalTime()} | {lastKnownKline.Close}");
}
else if (lastKnownKline.OpenTime == data.Data.OpenTime && lastKnownKline.Close != data.Data.Close)
{
// Real time
if (!_locked)
{
_logger.LogError($"Real time | Open time: {data.Data.OpenTime.ToLocalTime()} | {data.Data.Close}");
_locked = true;

BackgroundJob.Schedule(() => Checker(), TimeSpan.FromMinutes(1));
}
else
{
_logger.LogInformation("Locked");
}
}

lastKnownKline = data.Data.ToKline();
}).Data;
}

public void Checker()
{
_logger.LogWarning($"{DateTime.UtcNow.ToLocalTime()}");

_locked = false;
}

最佳答案

我想到了多种解决方案,我将从最简单的开始。

如果您正在运行单个实例,则:

1- 使用静态变量:

public static bool _locked = false;

或者

2-startup 中将整个类定义为 Singleton,因此每次 Hangfire 尝试激活该类时,它都会到达同一个实例。

public void ConfigureServices(IServiceCollection services)
{
//....

services.AddSingleton<SomeClass>();

//....
}

如果您在多个实例上运行此任务

然后您应该将此变量存储到数据库(如 Redis)并使用数据库更改其状态。因此可以从多个作业访问同一个变量。

关于c# - Hangfire 在作业中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com