/// <summary>
 /// Asynchronously read record header and bins for specified key.
 /// Create listener, call asynchronous get and return task monitor.
 /// <para>
 /// The policy can be used to specify timeouts.
 /// </para>
 /// </summary>
 /// <param name="policy">generic configuration parameters, pass in null for defaults</param>
 /// <param name="token">cancellation token</param>
 /// <param name="key">unique record identifier</param>
 /// <param name="binNames">bins to retrieve</param>
 /// <exception cref="AerospikeException">if queue is full</exception>
 public Task<Record> Get(Policy policy, CancellationToken token, Key key, params string[] binNames)
 {
     RecordListenerAdapter listener = new RecordListenerAdapter(token);
     Get(policy, listener, key, binNames);
     return listener.Task;
 }
 /// <summary>
 /// Asynchronously read record generation and expiration only for specified key.  Bins are not read.
 /// Create listener, call asynchronous get header and return task monitor.
 /// <para>
 /// The policy can be used to specify timeouts.
 /// </para>
 /// </summary>
 /// <param name="policy">generic configuration parameters, pass in null for defaults</param>
 /// <param name="token">cancellation token</param>
 /// <param name="key">unique record identifier</param>
 /// <exception cref="AerospikeException">if queue is full</exception>
 public Task<Record> GetHeader(Policy policy, CancellationToken token, Key key)
 {
     RecordListenerAdapter listener = new RecordListenerAdapter(token);
     GetHeader(policy, listener, key);
     return listener.Task;
 }
 //-------------------------------------------------------
 // Generic Database Operations
 //-------------------------------------------------------
 /// <summary>
 /// Asynchronously perform multiple read/write operations on a single key in one batch call.
 /// Create listener, call asynchronous operate and return task monitor.
 /// <para>
 /// An example would be to add an integer value to an existing record and then
 /// read the result, all in one database call.
 /// </para>
 /// <para>
 /// Both scalar bin operations (Operation) and list bin operations (ListOperation)
 /// can be performed in same call.
 /// </para>
 /// </summary>
 /// <param name="policy">write configuration parameters, pass in null for defaults</param>
 /// <param name="token">cancellation token</param>
 /// <param name="key">unique record identifier</param>
 /// <param name="operations">database operations to perform</param>
 /// <exception cref="AerospikeException">if queue is full</exception>
 public Task<Record> Operate(WritePolicy policy, CancellationToken token, Key key, params Operation[] operations)
 {
     RecordListenerAdapter listener = new RecordListenerAdapter(token);
     Operate(policy, listener, key, operations);
     return listener.Task;
 }