Here is the IHostedServiceWorker:
public class Worker :using BackgroundService {System.Data; private readonly ILogger<Worker>using _logger;System.Data.SqlClient; private readonly IHttpClientFactoryusing _httpClientFactory;System.Diagnostics; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using privateSystem.Net.Http.Json; using readonlySystem.Text; using IConfigurationPurchaseRazerCodesMultipleRequestService.Modal; using _configuration;TrendyolGameCodeService.Modal; public Worker(ILogger<Worker> logger, IHttpClientFactory httpClientFactory, IConfiguration configuration) { _logger = logger; _httpClientFactory = httpClientFactory; _configuration = configuration; } namespace PurchaseRazerCodesMultipleRequestService { protected overridepublic asyncclass TaskWorker ExecuteAsync(CancellationToken: stoppingToken)BackgroundService { //Timer with 3 mins var timer = new PeriodicTimer(TimeSpan.FromMinutes(3)); while (await timer.WaitForNextTickAsync(stoppingToken)) private readonly ILogger<Worker> {_logger; private readonly awaitIHttpClientFactory GetData();_httpClientFactory; _logger.LogInformation("Worker runningprivate at:readonly {time}",IConfiguration DateTimeOffset.Now);_configuration; public Worker(ILogger<Worker> logger, IHttpClientFactory httpClientFactory, IConfiguration configuration) { _logger = logger; _httpClientFactory = httpClientFactory; _configuration = configuration; } } private async Task MakeRequestsToRemoteService(string productCode, long id) { protected override async ifTask ExecuteAsync(id <= 0) throw newCancellationToken ArgumentOutOfRangeException(nameof(id)stoppingToken); try { var httpClient = _httpClientFactory.CreateClient("RazerClient"); //Token httpClient.DefaultRequestHeaders.Accept.Add(///Random Timer var timer = new PeriodicTimer(TimeSpan.FromMinutes(new MediaTypeWithQualityHeaderValueRandom("application/x-www-form-urlencoded").Next(1, 2))); var_logger.LogInformation("Timer: tokenContent{timer}", =DateTimeOffset.Now); new FormUrlEncodedContent while (new[]await timer.WaitForNextTickAsync(stoppingToken)) { new KeyValuePair<string,await string>GetData("username", "Test"),; new KeyValuePair<string, string>_logger.LogInformation("password", "123456") "Worker running at: {time}", DateTimeOffset.Now); }); using var tokenResponse = await httpClient.PostAsync(_configuration["Token:Production"], tokenContent);} private async Task MakeRequestsToRemoteService(string productCode, long id, int amount, int bulkId) { if ((intid <= 0)tokenResponse.StatusCode ==throw 200new ArgumentOutOfRangeException(nameof(id)); try { var tokenhttpClient = await tokenResponse.Content_httpClientFactory.ReadAsStringAsyncCreateClient("RazerClient"); //Call Razer Multi Requests httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",Token token); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded")); #regionvar CalculatetokenContent quantity= new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("username", "Test"), new KeyValuePair<string, string>("password", "+REyN-#V5!_DgUn+y%hVj7VmyhN^+?%y+Qxkc-bLZR6$uqsYV") }); var num = amount; using var firstNumtokenResponse = 50; var secondNumawait =httpClient.PostAsync(_configuration["Token:Production"], 50;tokenContent); if (num(int)tokenResponse.StatusCode <== 100200) { firstNum = (num + 1) / 2; var secondNumtoken = num - firstNum; await }tokenResponse.Content.ReadAsStringAsync(); #endregion //Call Razer Multi Requests var quantities httpClient.DefaultRequestHeaders.Authorization = new List<int>AuthenticationHeaderValue("Bearer", { firstNum, secondNum}; var cts = new CancellationTokenSource( token); ParallelOptions parallelOptions = new httpClient.DefaultRequestHeaders.Accept.Add() { new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded")); MaxDegreeOfParallelism = 2, #region Calculate quantity CancellationToken = cts.Token var num = amount; }; var firstNum try= 50; { var secondNum = 50; await Parallel.ForEachAsync(quantities, parallelOptions, async if (quantity,num ct)< =>100) { var contentfirstNum = new FormUrlEncodedContent(new[] { new KeyValuePair<string,num string>("productCode",+ productCode1), new KeyValuePair<string, string>("quantity",/ quantity.ToString()),2; secondNum new= KeyValuePair<string,num string>("clientTrxRef",- bulkId.ToString())firstNum; }); using var response = await httpClient.PostAsync(_configuration["Razer:Production"], content, ct);#endregion var quantities = new ifList<int> { firstNum, secondNum}; var cts = new CancellationTokenSource(); ParallelOptions parallelOptions = new(int)response { MaxDegreeOfParallelism = 2, CancellationToken = cts.StatusCodeToken == 200 }; try { await Parallel.ForEachAsync(quantities, parallelOptions, async (quantity, ct) => { var couponcontent = awaitnew responseFormUrlEncodedContent(new[] { new KeyValuePair<string, string>("productCode", productCode), new KeyValuePair<string, string>("quantity", quantity.ContentToString()), new KeyValuePair<string, string>("clientTrxRef", bulkId.ReadFromJsonAsync<Root>ToString(cancellationToken:)) ct }); _loggerusing var response = await httpClient.LogInformationPostAsync("REFERENCE ID_configuration["Razer:Production"], {referenceId}"content, coupon.ReferenceIdct); if ((int)response.StatusCode == 200) { var coupon = await response.Content.ReadFromJsonAsync<Root>(cancellationToken: ct); _logger.LogInformation("REFERENCE ID: {referenceId}", coupon.ReferenceId); await UpdateData(id); } else { _logger.LogError("Purchase ServiceError: {statusCode}", (int)response.StatusCode); } }); } catch (OperationCanceledException ex) { _logger.LogError("Operation canceled: {Message}", ex.Message); } } catch (OperationCanceledException ex)else { _logger.LogError("Operation"Token canceledServiceError: {MessagestatusCode}", ex(int)tokenResponse.MessageStatusCode); } } elsecatch (Exception e) { _logger.LogError("Token ServiceError"Error: {statusCodeError} ", e.Message); (int)tokenResponse.StatusCode); } } catch (Exception e) { _logger.LogError("Error: {Error} ", e.Message); throw; } } private async Task GetData() { var sw = Stopwatch.StartNew(); var connString = _configuration["ConnectionStrings:Default"]; await using var sqlConnection = new SqlConnection(connString); sqlConnection.Open(); awaitprivate usingasync varTask commandGetData() = new SqlCommand { Connection = sqlConnection } var sw = Stopwatch.StartNew(); const string sql var connString = @"Select_configuration["ConnectionStrings:Default"]; TOP 1 Id, BulkId, Amount, ProductCode from BulkPurchases where status await using var sqlConnection = 0";new SqlConnection(connString); command.CommandText = sql; sqlConnection.Open(); await using var command = new SqlCommand { Connection = sqlConnection }; const string sql = @"Select TOP 1 Id, BulkPurchaseRequestId, Amount, ProductCode from BulkPurchases where status = 0 ORDER BY NEWID()"; command.CommandText = sql; try { await using var reader = await command.ExecuteReaderAsync(); while (reader.Read())try { await using var reader = await command.ExecuteReaderAsync(); while (reader.Read()) { _logger.LogInformation( "Order {Id}, {BulkId}, {Amount}, {ProductCode}", reader.GetInt32(0), reader.GetInt32(1), reader.GetInt32(2), reader.GetString(3)); await MakeRequestsToRemoteService(reader.GetString(3).Trim(), reader.GetInt32(0), reader.GetInt32(2),reader.GetInt32(1)); } } } catch (SqlException exception) { _logger.LogError("Error: {Error} ", exception.Message); throw; // Throw exception if this exception is unexpected } sw.Stop();} _logger.LogInformation($"******** ELAPSED TIME: { sw.Elapsed.TotalSeconds} seconds ********"Stop(); } private async Task UpdateData(long id) { var connString_logger.LogInformation($"******** =ELAPSED _configuration["ConnectionStringsTIME:Default"]; await using var sqlConnection ={sw.Elapsed.TotalSeconds} newseconds SqlConnection(connString********"); sqlConnection.Open();} awaitprivate usingasync varTask commandUpdateData(long =id) new SqlCommand { Connection = sqlConnection }; { const string sql var connString = @"Update_configuration["ConnectionStrings:Default"]; BulkPurchases set status = 1 where Id await using var sqlConnection = @id";new SqlConnection(connString); command.CommandText = sql; sqlConnection.Open(); await using var command.Parameters.Add( = new SqlParameter("id",SqlCommand id)){ Connection = sqlConnection }; const string sql = @"Update BulkPurchases set status = 1 where Id = @id"; command.CommandText = sql; command.Parameters.Add(new SqlParameter("id", id)); try { await command.ExecuteNonQueryAsync(); } catch (SqlException exception) { _logger.LogError("Error: {Error} ", exception.Message); throw; // Throw exception if this exception is unexpected } } } }