HubWorkerHolder.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using System.Threading.Channels;
  2. using Microsoft.Extensions.Logging;
  3. namespace CompServ.Hub
  4. {
  5. public class HubWorkerHolder(ILogger<HubWorkerHolder> logger)
  6. {
  7. internal readonly List<(string url, int ratio)> Workers = new();
  8. internal readonly Channel<string> Queue1 = Channel.CreateBounded<string>(1);
  9. public void RegisterWorker(string url, int ratio)
  10. {
  11. logger.LogInformation($"Register worker: {url} with ratio {ratio}");
  12. lock (Workers)
  13. {
  14. if (Workers.Any(p => p.url == url)) return;
  15. Workers.Add((url, ratio));
  16. }
  17. }
  18. public void UnRegisterWorker(string url)
  19. {
  20. logger.LogInformation($"Un Register worker: {url}");
  21. lock (Workers)
  22. {
  23. var found = Workers.FirstOrDefault(p => p.url == url);
  24. if (found != default) Workers.Remove(found);
  25. }
  26. }
  27. public async Task<string> GetWorkerAsync()
  28. {
  29. var url = await Queue1.Reader.ReadAsync();
  30. logger.LogInformation($"Assign worker: {url}");
  31. return url;
  32. }
  33. }
  34. }