示例#1
0
        public BackgroundTask(IServiceProvider serviceProvider, ILogger <T> logger, IDistributedSemaphoreProvider distributedSemaphoreProvider)
        {
            this.serviceProvider = serviceProvider;
            this.logger          = logger;
            this.distributedSemaphoreProvider = distributedSemaphoreProvider;
            using (var scope = serviceProvider.CreateScope())
            {
                var configuration = serviceProvider.GetRequiredService <IConfiguration>().GetSection($"backgroundtask:{typeof(T).Name}");
                var task          = scope.ServiceProvider.GetRequiredService <T>();
                var appName       = Environment.GetEnvironmentVariable("APP_NAME") ?? Assembly.GetEntryAssembly()?.GetName().Name ?? string.Empty;

                schedule     = CronExpression.Parse(configuration.GetValue("schedule", task.Schedule), CronFormat.IncludeSeconds);
                startupDelay = configuration.GetValue("initialDelay", task.InitialDelay);
                enabled      = configuration.GetValue("enabled", true);
                var degreeOfParallelism = configuration.GetValue("degreeOfParallelism", task.DegreeOfParallelism);

                if (!string.IsNullOrEmpty(appName))
                {
                    appName += "-";
                }
                semaphore = distributedSemaphoreProvider.CreateSemaphore($"{appName}backgroundtask:{typeof(T).Name}", degreeOfParallelism);

                logger.LogInformation("starting background task: initial delay {0}, schedule: {1}, parallelism: {2}",
                                      this.startupDelay, this.schedule.ToString(), task.DegreeOfParallelism);
            }
        }
示例#2
0
 public SemaphoreAsMutex(IDistributedSemaphore semaphore)
 {
     this._semaphore = semaphore;
 }