diff --git a/server/src/UdpServer.cs b/server/src/UdpServer.cs index 4705f14..1f62f62 100644 --- a/server/src/UdpServer.cs +++ b/server/src/UdpServer.cs @@ -192,34 +192,44 @@ public class UDPServer UDPData? data = null; var key = $"{ipAddr}-{taskID}"; - try + var startTime = DateTime.Now; + var isTimeout = false; + while (!isTimeout) { - using (await udpDataLock.AcquireWriteLockAsync(TimeSpan.FromMilliseconds(timeout))) + var elapsed = DateTime.Now - startTime; + isTimeout = elapsed >= TimeSpan.FromMilliseconds(timeout); + if (isTimeout) break; + + try { - if (udpData.TryGetValue(key, out var sortedList) && sortedList.Count > 0) + using (await udpDataLock.AcquireWriteLockAsync(TimeSpan.FromMilliseconds(timeout))) { - // 获取最早的数据(第一个元素) - var firstKey = sortedList.Keys[0]; - data = sortedList[firstKey]; - sortedList.RemoveAt(0); + if (udpData.TryGetValue(key, out var sortedList) && sortedList.Count > 0) + { + // 获取最早的数据(第一个元素) + var firstKey = sortedList.Keys[0]; + data = sortedList[firstKey]; + sortedList.RemoveAt(0); + } } } - - if (data is null) + catch { logger.Trace("Get nothing even after time out"); return new(null); } - else - { - return new(data.DeepClone()); - } } - catch + + + if (data is null) { logger.Trace("Get nothing even after time out"); return new(null); } + else + { + return new(data.DeepClone()); + } } /// @@ -234,36 +244,45 @@ public class UDPServer List? data = null; var key = $"{ipAddr}-{taskID}"; - try + + var startTime = DateTime.Now; + var isTimeout = false; + while (!isTimeout) { - using (await udpDataLock.AcquireWriteLockAsync(TimeSpan.FromMilliseconds(timeout))) + var elapsed = DateTime.Now - startTime; + isTimeout = elapsed >= TimeSpan.FromMilliseconds(timeout); + if (isTimeout) break; + + try { - if (udpData.TryGetValue(key, out var sortedList) && sortedList.Count > 0) + using (await udpDataLock.AcquireWriteLockAsync(TimeSpan.FromMilliseconds(timeout))) { - data = new List(sortedList.Values); - // 输出数据 - // PrintDataArray(data); - sortedList.Clear(); + if (udpData.TryGetValue(key, out var sortedList) && sortedList.Count > 0) + { + data = new List(sortedList.Values); + // 输出数据 + // PrintDataArray(data); + sortedList.Clear(); + } + } - } - - if (data is null) + catch { logger.Trace("Get nothing even after time out"); return new(null); } - else - { - return new(data); - } } - catch + + if (data is null) { logger.Trace("Get nothing even after time out"); return new(null); } - + else + { + return new(data); + } } ///