【发布时间】:2019-12-07 10:56:18
【问题描述】:
我知道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;
}
【问题讨论】:
-
您好,我认为当您调用函数异步时,_loger 函数是同步模式
-
@LDS,上下文落在
_locked而不是_logger。 -
IF 所以将变量值传递给函数并像时间一样在检查器函数中进行检查
-
@LDS,这个想法是改变工作内部的外部变量。不检查它的价值。
-
@nop,为什么不将
_lock定义为静态变量,或者使用Redis之类的快速数据库来更改_lock变量
标签: c# asp.net-core hangfire