diff --git a/DXMainClient/Domain/Multiplayer/CnCNet/CnCNetPlayerCountTask.cs b/DXMainClient/Domain/Multiplayer/CnCNet/CnCNetPlayerCountTask.cs index d289f5839..582b7af6c 100644 --- a/DXMainClient/Domain/Multiplayer/CnCNet/CnCNetPlayerCountTask.cs +++ b/DXMainClient/Domain/Multiplayer/CnCNet/CnCNetPlayerCountTask.cs @@ -22,7 +22,9 @@ public static class CnCNetPlayerCountTask public static void InitializeService(CancellationTokenSource cts) { cncnetLiveStatusIdentifier = ClientConfiguration.Instance.CnCNetLiveStatusIdentifier; - PlayerCount = GetCnCNetPlayerCount(); + + // This call is synchronous. Therefore, we use a short timeout to avoid blocking the main thread for too long. + PlayerCount = GetCnCNetPlayerCount(timeoutMilliseconds: 1000); CnCNetGameCountUpdated?.Invoke(null, new PlayerCountEventArgs(PlayerCount)); ThreadPool.QueueUserWorkItem(new WaitCallback(RunService), cts); @@ -41,12 +43,12 @@ private static void RunService(object tokenObj) } else { - CnCNetGameCountUpdated?.Invoke(null, new PlayerCountEventArgs(GetCnCNetPlayerCount())); + CnCNetGameCountUpdated?.Invoke(null, new PlayerCountEventArgs(GetCnCNetPlayerCount(timeoutMilliseconds: 5000))); } } } - private static int GetCnCNetPlayerCount() + private static int GetCnCNetPlayerCount(int timeoutMilliseconds = 5000) { try { @@ -56,7 +58,7 @@ private static int GetCnCNetPlayerCount() if (string.IsNullOrWhiteSpace(ClientConfiguration.Instance.CnCNetPlayerCountURL)) return -1; - WebClient client = new ExtendedWebClient(); + WebClient client = new ExtendedWebClient(timeout: timeoutMilliseconds); Stream data = client.OpenRead(ClientConfiguration.Instance.CnCNetPlayerCountURL); string info = string.Empty; diff --git a/DXMainClient/Domain/Multiplayer/CnCNet/ExtendedWebClient.cs b/DXMainClient/Domain/Multiplayer/CnCNet/ExtendedWebClient.cs index 2fdac16fa..b41a63f83 100644 --- a/DXMainClient/Domain/Multiplayer/CnCNet/ExtendedWebClient.cs +++ b/DXMainClient/Domain/Multiplayer/CnCNet/ExtendedWebClient.cs @@ -8,8 +8,15 @@ namespace DTAClient.Domain.Multiplayer.CnCNet /// class ExtendedWebClient : WebClient { + /// + /// Initializes a new instance of the class with a default timeout of 10 seconds. + /// public ExtendedWebClient() : this(timeout: 10000) { } + /// + /// Initializes a new instance of the class with a specified timeout. + /// + /// Gets or sets the length of time, in milliseconds, before the request times out. public ExtendedWebClient(int timeout) { this.timeout = timeout;