private MethodInfo InitTaskExecute(MapReduceTask task, out object dictMap)
        {
            IDictionary tmpdict;

            task.FindTypesMap(out miMap, out dictMap, out mapper);
            task.FindTypesReduce(out miRed, out tmpdict, out reducer);
            task.ReduceResult = tmpdict;

            MethodInfo miExecuteGeneric = task.GetType().GetMethod("ExecuteMapReduce", BindingFlags.NonPublic | BindingFlags.Instance);

            ParameterInfo[] mapParams       = mapper.GetType().GetMethod("Map").GetParameters();
            Type[]          collectorParams = mapParams[2].ParameterType.GetGenericArguments();

            ParameterInfo[] reduceParams = reducer.GetType().GetMethod("Reduce").GetParameters();


            MAPKEY          = mapParams[0].ParameterType;
            MAPVALUE        = mapParams[1].ParameterType;
            REDUCEKEY       = collectorParams[0];
            REDUCEVALUE     = collectorParams[1];
            REDUCEDNEWVALUE = reduceParams[2].ParameterType;

            MethodInfo miExecute = miExecuteGeneric.MakeGenericMethod(new[] { MAPKEY, MAPVALUE, REDUCEKEY, REDUCEVALUE, REDUCEDNEWVALUE });

            return(miExecute);
        }
        private MethodInfo InitTaskExecute(MapReduceTask task, out object dictMap)
        {
            IDictionary tmpdict;

            task.FindTypesMap(out _miMap, out dictMap, out _mapper);
            task.FindTypesReduce(out _miRed, out tmpdict, out _reducer);
            task.ReduceResult = tmpdict;

            MethodInfo miExecuteGeneric = task.GetType().GetMethod("ExecuteMapReduce", BindingFlags.NonPublic | BindingFlags.Instance);

            ParameterInfo[] mapParams       = _mapper.GetType().GetMethod("Map").GetParameters();
            Type[]          collectorParams = mapParams[2].ParameterType.GetGenericArguments();

            ParameterInfo[] reduceParams = _reducer.GetType().GetMethod("Reduce").GetParameters();


            _mapkey          = mapParams[0].ParameterType;
            _mapvalue        = mapParams[1].ParameterType;
            _reducekey       = collectorParams[0];
            _reducevalue     = collectorParams[1];
            _reducednewvalue = reduceParams[2].ParameterType;

            MethodInfo miExecute = miExecuteGeneric.MakeGenericMethod(new[] { _mapkey, _mapvalue, _reducekey, _reducevalue, _reducednewvalue });

            return(miExecute);
        }
        private MethodInfo InitMergeDictionaries(MapReduceTask task)
        {
            MethodInfo miMergeGeneric = task.GetType().GetMethod("MergeDictionaries", BindingFlags.NonPublic | BindingFlags.Instance);

            MethodInfo miExecute = miMergeGeneric.MakeGenericMethod(new[] { REDUCEKEY, REDUCEVALUE, REDUCEDNEWVALUE });

            return(miExecute);
        }
        private MethodInfo InitMergeDictionaries(MapReduceTask task)
        {
            MethodInfo miMergeGeneric = task.GetType().GetMethod("MergeDictionaries", BindingFlags.NonPublic | BindingFlags.Instance);

            MethodInfo miExecute = miMergeGeneric.MakeGenericMethod(new[] { _reducekey, _reducevalue, _reducednewvalue });

            return(miExecute);
        }
        private void MergeDictionaries(MapReduceTask task, IDictionary from)
        {
            if (task == null || from == null)
            {
                return;
            }

            MethodInfo miMerge = InitMergeDictionaries(task);

            miMerge.Invoke(task, new object[] { reducer, from });
        }
        private void MergeDictionaries(MapReduceTask task, IEnumerable from)
        {
            if (task == null || from == null)
            {
                return;
            }

            var miMerge = InitMergeDictionaries(task);

            miMerge.Invoke(task, new[] { _reducer, from });
        }
        public void ExecuteStep(MapReduceTask task, IEnumerable input = null)
        {
            object     dictMap;
            MethodInfo miExecute = InitTaskExecute(task, out dictMap);

            task.MapThread    = new Thread(new ThreadStart(() => miExecute.Invoke(task, new[] { input, mapper, reducer, dictMap, task.ReduceResult, true, false })));
            task.ReduceThread = new Thread(new ThreadStart(() => miExecute.Invoke(task, new[] { input, mapper, reducer, dictMap, task.ReduceResult, false, true })));


            task.MapThread.Start();
            task.ReduceThread.Start();
        }