public AsyncExecute(AsyncExecute other)
     : base(other)
 {
     this.writePolicy     = other.writePolicy;
     this.executeListener = other.executeListener;
     this.packageName     = other.packageName;
     this.functionName    = other.functionName;
     this.args            = other.args;
 }
 /// <summary>
 /// Asynchronously execute user defined function on server and return result.
 /// The function operates on a single record.
 /// The package name is used to locate the udf file location on the server:
 /// <para>
 /// udf file = &lt;server udf dir&gt;/&lt;package name&gt;.lua
 /// </para>
 /// <para>
 /// This method schedules the execute command with a channel selector and returns.
 /// Another thread will process the command and send the results to the listener.
 /// </para>
 /// </summary>
 /// <param name="policy">write configuration parameters, pass in null for defaults</param>
 /// <param name="listener">where to send results</param>
 /// <param name="key">unique record identifier</param>
 /// <param name="packageName">server package name where user defined function resides</param>
 /// <param name="functionName">user defined function</param>
 /// <param name="functionArgs">arguments passed in to user defined function</param>
 /// <exception cref="AerospikeException">if transaction fails</exception>
 public void Execute(WritePolicy policy, ExecuteListener listener, Key key, string packageName, string functionName, params Value[] functionArgs)
 {
     if (policy == null)
     {
         policy = writePolicyDefault;
     }
     AsyncExecute command = new AsyncExecute(cluster, policy, listener, key, packageName, functionName, functionArgs);
     command.Execute();
 }