소스 검색

Evict stale requests even just when running schedule

tznind 9 달 전
부모
커밋
b104b1bf38
1개의 변경된 파일14개의 추가작업 그리고 1개의 파일을 삭제
  1. 14 1
      Terminal.Gui/ConsoleDrivers/AnsiResponseParser/AnsiRequestScheduler.cs

+ 14 - 1
Terminal.Gui/ConsoleDrivers/AnsiResponseParser/AnsiRequestScheduler.cs

@@ -103,6 +103,16 @@ internal class AnsiRequestScheduler
         return false;
         return false;
     }
     }
 
 
+    private void EvictStaleRequests ()
+    {
+        foreach (var stale in _lastSend.Where (v => IsStale (v.Value)).Select (k => k.Key))
+        {
+            EvictStaleRequests (stale);
+        }
+    }
+
+    private bool IsStale (DateTime dt) => Now () - dt > _staleTimeout;
+
     /// <summary>
     /// <summary>
     ///     Looks to see if the last time we sent <paramref name="withTerminator"/>
     ///     Looks to see if the last time we sent <paramref name="withTerminator"/>
     ///     is a long time ago. If so we assume that we will never get a response and
     ///     is a long time ago. If so we assume that we will never get a response and
@@ -114,7 +124,7 @@ internal class AnsiRequestScheduler
     {
     {
         if (_lastSend.TryGetValue (withTerminator, out DateTime dt))
         if (_lastSend.TryGetValue (withTerminator, out DateTime dt))
         {
         {
-            if (Now () - dt > _staleTimeout)
+            if (IsStale (dt))
             {
             {
                 _parser.StopExpecting (withTerminator, false);
                 _parser.StopExpecting (withTerminator, false);
 
 
@@ -157,9 +167,12 @@ internal class AnsiRequestScheduler
             }
             }
         }
         }
 
 
+        EvictStaleRequests ();
+
         return false;
         return false;
     }
     }
 
 
+
     private void Send (AnsiEscapeSequenceRequest r)
     private void Send (AnsiEscapeSequenceRequest r)
     {
     {
         _lastSend.AddOrUpdate (r.Terminator, _ => Now (), (_, _) => Now ());
         _lastSend.AddOrUpdate (r.Terminator, _ => Now (), (_, _) => Now ());