public void WithThreadPool() { List<DataItem> values = new List<DataItem>(); var perThreadCount = _list.Count / _currentProcessorCount; var states = new List<FilteringWorkerState>(); var doneEvents = new ManualResetEvent[_currentProcessorCount - 1]; for (int i = 0; i < _currentProcessorCount - 1; i++) { var state = new FilteringWorkerState { First = i * perThreadCount, Count = perThreadCount, Source = _list, Data = new List<DataItem>(), DoneEvent = new ManualResetEvent(false) }; states.Add(state); doneEvents[i] = state.DoneEvent; ThreadPool.QueueUserWorkItem(new WaitCallback(Worker), state); } var stateBase = new FilteringWorkerState { First = perThreadCount * (_currentProcessorCount - 1), Count = _list.Count - perThreadCount * (_currentProcessorCount - 1) + 1, Source = _list, Data = new List<DataItem>() }; Worker(stateBase); var result = stateBase.Data; if (doneEvents.Length > 0) { WaitHandle.WaitAll(doneEvents); foreach (var state in states) { result.AddRange(state.Data); } } }
public void WithThreadPool() { List<DataItem> values = new List<DataItem>(); var state0 = new FilteringWorkerState { First = 0, Count = (Int32)(_list.Count / 2), Source = _list, Data = new List<DataItem>() }; ThreadPool.QueueUserWorkItem(new WaitCallback(Worker), state0); var state1 = new FilteringWorkerState { First = (Int32)(_list.Count / 2), Count = (Int32)(_list.Count / 2), Source = _list, Data = new List<DataItem>() }; Worker(state1); lock (state0) { for (int j = 0; j < state1.Data.Count; j++) { state0.Data.Add(state1.Data[j]); } } }