public int DrainTo <TE>(ICollection <TE> c, int maxElements) where TE : T { var request = QueueDrainToMaxSizeCodec.EncodeRequest(GetName(), maxElements); var result = Invoke(request, m => QueueDrainToMaxSizeCodec.DecodeResponse(m).response); foreach (var data in result) { var e = ToObject <T>(data); c.Add((TE)e); } return(result.Count); }
// TODO: Queue.Drain has issues // it may throw if the object is T but not TItem, need to review all these weird overloads // also deserializing immediately instead of returning a lazy thing? /// <inheritdoc /> public async Task <int> DrainToAsync <TItem>(ICollection <TItem> items, int count = int.MaxValue) where TItem : T { var requestMessage = QueueDrainToMaxSizeCodec.EncodeRequest(Name, count); var responseMessage = await Cluster.Messaging.SendToPartitionOwnerAsync(requestMessage, PartitionId).CAF(); var response = QueueDrainToMaxSizeCodec.DecodeResponse(responseMessage).Response; foreach (var itemData in response) { items.Add((TItem)ToObject <T>(itemData)); } return(response.Count); }
/// <inheritdoc /> public async Task <int> DrainToAsync(ICollection <T> items, int maxElements) { var requestMessage = QueueDrainToMaxSizeCodec.EncodeRequest(Name, maxElements); var responseMessage = await Cluster.Messaging.SendToPartitionOwnerAsync(requestMessage, PartitionId).CfAwait(); var response = QueueDrainToMaxSizeCodec.DecodeResponse(responseMessage).Response; foreach (var itemData in response) { items.Add(ToObject <T>(itemData)); } return(response.Count); }