/// <summary> /// Waits for the pending asynchronous command execution to complete. /// </summary> /// <param name="asyncResult">The reference to the pending asynchronous request to finish.</param> /// <returns>Command execution result.</returns> /// <example> /// <code source="..\..\TCMSSH.Tests\Classes\SshCommandTest.cs" region="Example SshCommand CreateCommand BeginExecute IsCompleted EndExecute" language="C#" title="Asynchronous Command Execution" /> /// </example> /// <exception cref="ArgumentException">Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult.</exception> public string EndExecute(IAsyncResult asyncResult) { if (this._asyncResult == asyncResult && this._asyncResult != null) { lock (this._endExecuteLock) { if (this._asyncResult != null) { // Make sure that operation completed if not wait for it to finish this.WaitOnHandle(this._asyncResult.AsyncWaitHandle); if (_channel.IsOpen) { _channel.Close(); } UnsubscribeFromEventsAndDisposeChannel(); _channel = null; _asyncResult = null; return(this.Result); } } } throw new ArgumentException("Either the IAsyncResult object did not come from the corresponding async method on this type, or EndExecute was called multiple times with the same IAsyncResult."); }
/// <summary> /// Begins an asynchronous command execution. /// </summary> /// <param name="callback">An optional asynchronous callback, to be called when the command execution is complete.</param> /// <param name="state">A user-provided object that distinguishes this particular asynchronous read request from other requests.</param> /// <returns> /// An <see cref="System.IAsyncResult" /> that represents the asynchronous command execution, which could still be pending. /// </returns> /// <exception cref="System.InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="SshException">Invalid operation.</exception> /// <exception cref="System.ArgumentException">CommandText property is empty.</exception> /// <exception cref="TCMSSH.Common.SshConnectionException">Client is not connected.</exception> /// <exception cref="TCMSSH.Common.SshOperationTimeoutException">Operation has timed out.</exception> /// <exception cref="InvalidOperationException">Asynchronous operation is already in progress.</exception> /// <exception cref="ArgumentException">CommandText property is empty.</exception> public IAsyncResult BeginExecute(AsyncCallback callback, object state) { // Prevent from executing BeginExecute before calling EndExecute if (this._asyncResult != null) { throw new InvalidOperationException("Asynchronous operation is already in progress."); } // Create new AsyncResult object this._asyncResult = new CommandAsyncResult { AsyncWaitHandle = new ManualResetEvent(false), IsCompleted = false, AsyncState = state, }; // When command re-executed again, create a new channel if (this._channel != null) { throw new SshException("Invalid operation."); } this.CreateChannel(); if (string.IsNullOrEmpty(this.CommandText)) { throw new ArgumentException("CommandText property is empty."); } this._callback = callback; this._channel.Open(); // Send channel command request this._channel.SendExecRequest(this.CommandText); return(_asyncResult); }