using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub.Scanner.ScanMiddlewares
{
    /// 
    /// 扫描并发限制中间件
    /// 
    [Service(ServiceLifetime.Singleton)]
    sealed class ConcurrentMiddleware : IMiddleware
    {
        private readonly SemaphoreSlim semaphoreSlim;
        /// 
        /// 扫描并发限制中间件
        /// 
        public ConcurrentMiddleware()
        {
            var currentCount = Environment.ProcessorCount * 2;
            this.semaphoreSlim = new SemaphoreSlim(currentCount, currentCount);
        }
        /// 
        /// 限制描并发扫
        /// 
        /// 
        /// 
        /// 
        public async Task InvokeAsync(GithubContext context, Func next)
        {
            try
            {
                await this.semaphoreSlim.WaitAsync(context.CancellationToken);
                await next();
            }
            finally
            {
                this.semaphoreSlim.Release();
            }
        }
    }
}