ProcessStateBagAquaDx.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using System.Net.Sockets;
  2. using SinMaiLauncher.Models;
  3. namespace SinMaiLauncher.ChildProcessHolder;
  4. internal class ProcessStateBagAquaDx(ILogger<ProcessStateBagAquaDx> logger, SettingReader infra) : ChildProcessStateBagForConsole(ChildProcessKind.AquaDx, infra.AquaDx)
  5. {
  6. protected override async Task<bool> CheckReadyAsync()
  7. {
  8. if (await base.CheckReadyAsync())
  9. {
  10. //尝试连接
  11. const int timeoutSecond = 90;
  12. const int retryIntervalMs = 1000; // 每秒重试一次
  13. var startTime = DateTime.Now;
  14. var settings = infra.Settings.Infra.AquaDx;
  15. while (DateTime.Now - startTime < TimeSpan.FromSeconds(timeoutSecond))
  16. {
  17. try
  18. {
  19. using var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  20. logger.LogInformation("Attempting to connect to AquaDx at {Host}:{Port}", settings.Host, settings.Port);
  21. await socket.ConnectAsync(settings.Host, settings.Port);
  22. return true; // 连接成功
  23. }
  24. catch (Exception ex)
  25. {
  26. logger.LogWarning(ex, "Connection failed. Retrying...");
  27. await Task.Delay(retryIntervalMs);
  28. }
  29. }
  30. }
  31. return false;
  32. }
  33. }