当使用 .NET Core 的 BackgroundService 时,如果您未正确分离事件处理程序(例如未在 Dispose() 方法中取消订阅事件),则可能会导致内存泄漏。以下代码演示了如何正确地分离事件:
public class MyBackgroundService : BackgroundService
{
private readonly ILogger _logger;
private readonly SomeService _someService;
public MyBackgroundService(ILogger logger, SomeService someService)
{
_logger = logger;
_someService = someService;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
// do some work...
_someService.SomeEvent += OnSomeEvent;
await Task.Delay(1000, stoppingToken); // event will fire during this delay
}
catch (Exception ex)
{
_logger.LogError(ex, "Error in MyBackgroundService");
}
finally
{
_someService.SomeEvent -= OnSomeEvent; // always unsubscribe to avoid memory leak
}
}
}
private void OnSomeEvent(object sender, EventArgs args)
{
// handle event...
}
public override void Dispose()
{
_someService.SomeEvent -= OnSomeEvent; // always unsubscribe on dispose
base.Dispose();
}
}