/// <summary>
 /// Asynchronously read multiple record headers and bins for specified keys in one batch call.
 /// Create listener, call asynchronous batch get and return task monitor.
 /// <para>
 /// If a key is not found, the record will be null.
 /// 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="keys">array of unique record identifiers</param>
 /// <param name="binNames">array of bins to retrieve</param>
 /// <exception cref="AerospikeException">if queue is full</exception>
 public Task<Record[]> Get(BatchPolicy policy, CancellationToken token, Key[] keys, params string[] binNames)
 {
     RecordArrayListenerAdapter listener = new RecordArrayListenerAdapter(token);
     Get(policy, listener, keys, binNames);
     return listener.Task;
 }
 /// <summary>
 /// Asynchronously read multiple record header data for specified keys in one batch call.
 /// Create listener, call asynchronous batch header get and return task monitor.
 /// <para>
 /// If a key is not found, the record will be null.
 /// 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="keys">array of unique record identifiers</param>
 /// <exception cref="AerospikeException">if queue is full</exception>
 public Task<Record[]> GetHeader(BatchPolicy policy, CancellationToken token, Key[] keys)
 {
     RecordArrayListenerAdapter listener = new RecordArrayListenerAdapter(token);
     GetHeader(policy, listener, keys);
     return listener.Task;
 }