예제 #1
0
        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);
        }
예제 #2
0
        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));
        }