namespace SukaBlyad { using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddSingleton(); services.AddHostedService(); services.AddHostedService(); }); } public class SquareWorker : BackgroundService { private readonly ILogger _logger; private readonly SquareQueue _queue; public SquareWorker(ILogger logger, SquareQueue queue) { _logger = logger; _queue = queue; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var data = await _queue.GetData(); _logger.LogInformation($"Square of {data.Item1} and {data.Item2} = {data.Item1 * data.Item2}"); await Task.Delay(1000, stoppingToken); } } } public class SquareQueue { ILogger _logger; ConcurrentQueue<(double, double)> dataQueue; public SquareQueue(ILogger logger) { _logger = logger; dataQueue = new ConcurrentQueue<(double, double)>(); } public async Task<(double, double)> GetData() { await Task.Yield(); if (dataQueue.TryDequeue(out var result)) return result; return (0, 0); } public async void AddData(double a, double b) { await Task.Yield(); dataQueue.Enqueue((a, b)); } } public class AddDataWorcker : BackgroundService { private readonly ILogger _logger; private readonly SquareQueue _queue; Random random = new Random(); public AddDataWorcker(ILogger logger, SquareQueue queue) { _logger = logger; _queue = queue; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _queue.AddData(random.NextDouble() + random.Next(100), random.NextDouble() + random.Next(100)); await Task.Delay(1000, stoppingToken); } } } }