protected IWorker SelectWorker(Expression <Func <TEntity, object> > predicate, out TEntity itemToProcess) { var chooseWorker = new Func <TKey, IWorker>(key => { lock (new object()) { if (_groupingKeyDictionary.ContainsKey(key)) { return(Workers.ElementAt(_groupingKeyDictionary[key])); } var worker = base.SelectWorker(); _groupingKeyDictionary.Add(key, worker.WorkerId); return(worker); } }); if (!(predicate.Body is NewExpression memberSelector)) { throw new Exception($"Predicate is not valid"); } itemToProcess = GetUnderlyingParameterValue(memberSelector); var groupingKey = GetKey(predicate, itemToProcess); return(chooseWorker(groupingKey)); }
internal Worker GetWorker(int index) { return(Workers.ElementAt(index)); }