hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致的性能问题

如题
hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放,导致产生大量的Timer一直在执行,占用大量cpu和内存。
https://github.com/sergezhigunov/Hangfire.EntityFrameworkCore/issues/32

public class Worker : IBackgroundProcess
{
 public void Execute(BackgroundProcessContext context)
 {
    using (var fetchedJob = connection.FetchNextJob(_queues.ToArray(), context.StoppingToken))
    {
      ...
      fetchedJob.RemoveFromQueue();// 它会设置EFCoreFetchedJob._completed=true,进而导致后续的_timer.Dispose()未执行
      ...
    }
  }
}
internal sealed class EFCoreFetchedJob : IFetchedJob
{
  private bool _completed;
  public void RemoveFromQueue()
  {
    lock (_lock)
    {
      _storage.UseContext(context =>
      {
        context.Remove(_queuedJob);
        try
        {
          context.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
          // Someone else already has removed item, database wins
        }
      });
       _completed = true;//这里在Dispose前就执行了
     }
  }
  public void Dispose()
  {
    Dispose(true);
    GC.SuppressFinalize(this);
  }

  private void Dispose(bool disposing)
  {
    if (!_disposed)
    {
        if (disposing && !_completed)//因为_completed=true,所以_timer.Dispose()不执行
        {
            _timer.Dispose();
            Requeue();
        }
        _disposed = true;
    }
  }
}
posted @   Rick Carter  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 这或许是全网最全的 DeepSeek 使用指南,95% 的人都不知道的使用技巧(建议收藏)
· 拒绝繁忙!免费使用 deepseek-r1:671B 参数满血模型
· 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)
· Sdcb Chats 重磅更新:深度集成 DeepSeek-R1,思维链让 AI 更透明!
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
点击右上角即可分享
微信分享提示