瀏覽代碼

Fixes #2889. NetDriver leaks Task+DelayPromiseWithCancellation etc... objects

BDisp 1 年之前
父節點
當前提交
2ec9f58749
共有 1 個文件被更改,包括 13 次插入3 次删除
  1. 13 3
      Terminal.Gui/ConsoleDrivers/NetDriver.cs

+ 13 - 3
Terminal.Gui/ConsoleDrivers/NetDriver.cs

@@ -136,7 +136,7 @@ internal class NetEvents : IDisposable {
 
 	public InputResult? DequeueInput ()
 	{
-		while (!_inputReadyCancellationTokenSource.Token.IsCancellationRequested) {
+		while (_inputReadyCancellationTokenSource != null && !_inputReadyCancellationTokenSource.Token.IsCancellationRequested) {
 			_waitForStart.Set ();
 			_winChange.Set ();
 
@@ -185,7 +185,12 @@ internal class NetEvents : IDisposable {
 	{
 		while (!_inputReadyCancellationTokenSource.Token.IsCancellationRequested) {
 
-			_waitForStart.Wait (_inputReadyCancellationTokenSource.Token);
+			try {
+				_waitForStart.Wait (_inputReadyCancellationTokenSource.Token);
+			} catch (OperationCanceledException) {
+
+				return;
+			}
 			_waitForStart.Reset ();
 
 			if (_inputQueue.Count == 0) {
@@ -1339,9 +1344,14 @@ internal class NetMainLoop : IMainLoopDriver {
 			} catch (OperationCanceledException) {
 				return;
 			} finally {
-				_waitForProbe.Reset ();
+				if (_waitForProbe.IsSet) {
+					_waitForProbe.Reset ();
+				}
 			}
 
+			if (_inputHandlerTokenSource.IsCancellationRequested) {
+				return;
+			}
 			if (_resultQueue.Count == 0) {
 				_resultQueue.Enqueue (_netEvents.DequeueInput ());
 			}