private async Task <IDictionary <TKey, TResult> > ExecuteAsync <TResult>(IEntryProcessor <TResult> processor, IEnumerable <TKey> keys, CancellationToken cancellationToken) { if (keys == null) { throw new ArgumentNullException(nameof(keys)); } var keysmap = keys.ToDictionary(x => ToSafeData(x), x => x); if (keysmap.Count == 0) { return(new Dictionary <TKey, TResult>()); } var processorData = ToSafeData(processor); var requestMessage = MapExecuteOnKeysCodec.EncodeRequest(Name, processorData, keysmap.Keys); var responseMessage = await Cluster.Messaging.SendAsync(requestMessage, cancellationToken).CfAwait(); var response = MapExecuteOnKeysCodec.DecodeResponse(responseMessage).Response; var result = new Dictionary <TKey, TResult>(); foreach (var(keyData, valueData) in response) { if (!keysmap.TryGetValue(keyData, out var key)) { throw new InvalidOperationException("Server returned an unexpected key."); } result[key] = ToObject <TResult>(valueData); } return(result); }
public IDictionary <TKey, object> ExecuteOnKeys(ISet <TKey> keys, IEntryProcessor entryProcessor) { if (keys != null && keys.Count == 0) { return(new Dictionary <TKey, object>()); } var dataList = ToDataList(keys); var request = MapExecuteOnKeysCodec.EncodeRequest(Name, ToData(entryProcessor), dataList); var response = Invoke(request); var resultParameters = MapExecuteOnKeysCodec.DecodeResponse(response); return(DeserializeEntries <TKey>(resultParameters.Response)); }