From 48f6a2ae7aaaad43e943512db93fa497ed69219d Mon Sep 17 00:00:00 2001 From: SadPencil Date: Wed, 10 Dec 2025 15:09:51 +0800 Subject: [PATCH] Use a shorter timeout for CnCNet player count retrieval --- .../Domain/Multiplayer/CnCNet/CnCNetPlayerCountTask.cs | 10 ++++++---- .../Domain/Multiplayer/CnCNet/ExtendedWebClient.cs | 7 +++++++ 2 files changed, 13 insertions(+), 4 deletions(-) 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;