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;
}
}
}
作者:Rick Carter
出处:http://pains.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版