Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
 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]);
         }
     }
 }