@ -16,6 +16,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
public ILogger < DefaultDynamicBackgroundWorkerManager > Logger { get ; set ; }
private readonly ConcurrentDictionary < string , InMemoryDynamicBackgroundWorker > _d ynamicWorkers ;
private readonly SemaphoreSlim _ semaphore ;
private bool _ isDisposed ;
public DefaultDynamicBackgroundWorkerManager ( IServiceProvider serviceProvider )
@ -23,6 +24,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
ServiceProvider = serviceProvider ;
Logger = NullLogger < DefaultDynamicBackgroundWorkerManager > . Instance ;
_d ynamicWorkers = new ConcurrentDictionary < string , InMemoryDynamicBackgroundWorker > ( ) ;
_ semaphore = new SemaphoreSlim ( 1 , 1 ) ;
}
public virtual async Task AddAsync (
@ -44,32 +46,48 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
"Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)." ) ;
}
if ( _d ynamicWorkers . TryRemove ( workerName , out var existingWorker ) )
await _ semaphore . WaitAsync ( cancellationToken ) ;
try
{
await existingWorker . StopAsync ( cancellationToken ) ;
Logger . LogInformation ( "Replaced existing dynamic worker: {WorkerName}" , workerName ) ;
}
if ( _d ynamicWorkers . TryRemove ( workerName , out var existingWorker ) )
{
await existingWorker . StopAsync ( cancellationToken ) ;
Logger . LogInformation ( "Replaced existing dynamic worker: {WorkerName}" , workerName ) ;
}
var worker = CreateDynamicWorker ( workerName , schedule , handler ) ;
_d ynamicWorkers [ workerName ] = worker ;
var worker = CreateDynamicWorker ( workerName , schedule , handler ) ;
_d ynamicWorkers [ workerName ] = worker ;
await worker . StartAsync ( cancellationToken ) ;
await worker . StartAsync ( cancellationToken ) ;
}
finally
{
_ semaphore . Release ( ) ;
}
}
public virtual async Task < bool > RemoveAsync ( string workerName , CancellationToken cancellationToken = default )
{
Check . NotNullOrWhiteSpace ( workerName , nameof ( workerName ) ) ;
if ( ! _d ynamicWorkers . TryRemove ( workerName , out var worker ) )
await _ semaphore . WaitAsync ( cancellationToken ) ;
try
{
return false ;
}
if ( ! _d ynamicWorkers . TryRemove ( workerName , out var worker ) )
{
return false ;
}
await worker . StopAsync ( cancellationToken ) ;
return true ;
await worker . StopAsync ( cancellationToken ) ;
return true ;
}
finally
{
_ semaphore . Release ( ) ;
}
}
public virtual Task < bool > UpdateScheduleAsync (
public virtual async Task < bool > UpdateScheduleAsync (
string workerName ,
DynamicBackgroundWorkerSchedule schedule ,
CancellationToken cancellationToken = default )
@ -86,13 +104,21 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
"Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)." ) ;
}
if ( ! _d ynamicWorkers . TryGetValue ( workerName , out var worker ) )
await _ semaphore . WaitAsync ( cancellationToken ) ;
try
{
return Task . FromResult ( false ) ;
}
if ( ! _d ynamicWorkers . TryGetValue ( workerName , out var worker ) )
{
return false ;
}
worker . UpdateSchedule ( schedule ) ;
return Task . FromResult ( true ) ;
worker . UpdateSchedule ( schedule ) ;
return true ;
}
finally
{
_ semaphore . Release ( ) ;
}
}
public virtual bool IsRegistered ( string workerName )
@ -123,6 +149,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
}
_d ynamicWorkers . Clear ( ) ;
_ semaphore . Dispose ( ) ;
}
protected virtual InMemoryDynamicBackgroundWorker CreateDynamicWorker (