От: | Аноним | ||
Дата: | 10.10.10 09:34 | ||
Оценка: |
public class PCQueue
{
readonly object _locker = new object();
Thread[] _workers;
Queue<Action> _itemQ = new Queue<Action>();
public PCQueue(int workerCount)
{
_workers = new Thread[workerCount];
for (int i = 0; i < workerCount; i++)
(_workers[i] = new Thread(Consume)).Start();
}
public void Shutdown()
{
for (int i = 0; i < _workers.Length; i++)
{
lock (_locker)
{
_itemQ.Enqueue(null);
Monitor.Pulse(_locker);
}
}
}
public void QueueWorkItem<T>(Action<T> action, T arg)
{
lock (_locker)
{
_itemQ.Enqueue(()=>action(arg));
Monitor.Pulse(_locker);
}
}
void Consume()
{
while (true)
{
Action item;
lock (_locker)
{
while (_itemQ.Count == 0) Monitor.Wait(_locker);
item = _itemQ.Dequeue();
}
if (item == null) return;
item();
}
}
}