//This file is part of ORM.NET.
//
//ORM.NET is free software; you can redistribute it and/or
//modify it under the terms of the GNU Lesser General Public
//License as published by the Free Software Foundation; either
//version 2.1 of the License, or (at your option) any later version.
//
//ORM.NET is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
//Lesser General Public License for more details.
//
//You should have received a copy of the GNU Lesser General Public
//License along with ORM.NET; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using System.Collections;
using System.Threading;
using System.Diagnostics;
using System.ComponentModel;
namespace OrmLib{
/// <summary>
/// Summary description for JobQueue.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public class JobQueue
{
private Queue jobs = Queue.Synchronized( new Queue() );
private ManualResetEvent ExitEvent = new ManualResetEvent(false);
private ManualResetEvent ThreadsCompleteEvent = new ManualResetEvent(false);
private AutoResetEvent JobsWaitingEvent = new AutoResetEvent( false );
private long NumActiveThreads = 0;
private int DefaultNumOfThreads = 10;
public JobQueue()
{
for (int i = 0; i < DefaultNumOfThreads; i++)
{
Thread t = new Thread( new ThreadStart( WorkerLoop));
t.Start();
}
}
public JobQueue(int numThreads)
{
for (int i = 0; i < numThreads; i++)
{
Thread t = new Thread( new ThreadStart( WorkerLoop));
t.Start();
}
}
public void WorkerLoop()
{
Interlocked.Increment( ref NumActiveThreads );
while(!ExitEvent.WaitOne(1, true))
{
try
{
if (jobs.Count > 0)
{
Job job = (Job) jobs.Dequeue();
if (job != null) job.DoJob();
}
else
{
JobsWaitingEvent.WaitOne(5000, true);
}
}
catch(Exception) { }
}
Debug.WriteLine("JobQueue Worker Thread exiting...");
long ThreadsLeft = Interlocked.Decrement(ref NumActiveThreads);
if (ThreadsLeft == 0) ThreadsCompleteEvent.Set();
}
public void AddJob( Job job)
{
jobs.Enqueue(job);
JobsWaitingEvent.Set();
}
public bool StopJobs( int timeoutMs)
{
ExitEvent.Set();
return ThreadsCompleteEvent.WaitOne( timeoutMs, true);
}
}
}
|