Преглед изворни кода

Added EndInvoke(TimeSpan timeout).

Gert Driesen пре 8 година
родитељ
комит
e643378cfc
1 измењених фајлова са 16 додато и 5 уклоњено
  1. 16 5
      src/Renci.SshNet/Common/AsyncResult.cs

+ 16 - 5
src/Renci.SshNet/Common/AsyncResult.cs

@@ -29,10 +29,12 @@ namespace Renci.SshNet.Common
         private Exception _exception;
 
         /// <summary>
-        /// Gets or sets a value indicating whether EndInvoke has been called on the current AsyncResult.
+        /// Gets or sets a value indicating whether <see cref="EndInvoke()"/> has been called on the current
+        /// <see cref="AsyncResult"/>.
         /// </summary>
         /// <value>
-        /// <c>true</c> if <see cref="EndInvoke()"/> has been called on the current <see cref="AsyncResult"/>; otherwise, <c>false</c>.
+        /// <c>true</c> if <see cref="EndInvoke()"/> has been called on the current <see cref="AsyncResult"/>;
+        /// otherwise, <c>false</c>.
         /// </value>
         public bool EndInvokeCalled { get; private set; }
 
@@ -75,15 +77,24 @@ namespace Renci.SshNet.Common
         /// <summary>
         /// Waits until the asynchronous operation completes, and then returns. 
         /// </summary>
-        public void EndInvoke()
+        internal void EndInvoke()
+        {
+            EndInvoke(Session.InfiniteTimeSpan);
+        }
+
+        /// <summary>
+        /// Waits until the asynchronous operation completes, and then returns. 
+        /// </summary>
+        internal void EndInvoke(TimeSpan timeout)
         {
             // This method assumes that only 1 thread calls EndInvoke for this object
             if (!IsCompleted)
             {
                 // If the operation isn't done, wait for it
-                AsyncWaitHandle.WaitOne();
-                AsyncWaitHandle.Dispose();
+                var completed = AsyncWaitHandle.WaitOne(timeout);
                 _asyncWaitHandle = null;  // Allow early GC
+                AsyncWaitHandle.Dispose();
+
             }
 
             EndInvokeCalled = true;