|
|
@ -11,28 +11,38 @@ namespace ZeroLevel.Utils
|
|
|
|
private BlockingCollection<T> _queue = new BlockingCollection<T>();
|
|
|
|
private BlockingCollection<T> _queue = new BlockingCollection<T>();
|
|
|
|
private List<Thread> _threads = new List<Thread>();
|
|
|
|
private List<Thread> _threads = new List<Thread>();
|
|
|
|
private bool _is_disposed = false;
|
|
|
|
private bool _is_disposed = false;
|
|
|
|
|
|
|
|
private int _tasks_in_progress = 0;
|
|
|
|
|
|
|
|
public int Count => _queue.Count + _tasks_in_progress;
|
|
|
|
|
|
|
|
|
|
|
|
public Multiprocessor(Action<T> handler, int size, int stackSize = 1024 * 1024)
|
|
|
|
public Multiprocessor(Action<T> handler, int size, int stackSize = 1024 * 1024)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (int i = 0; i < size; i++)
|
|
|
|
for (int i = 0; i < size; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var t = new Thread(() =>
|
|
|
|
var t = new Thread(() =>
|
|
|
|
{
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
T item;
|
|
|
|
T item;
|
|
|
|
while (!_is_disposed && !_queue.IsCompleted)
|
|
|
|
while (!_is_disposed)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (_queue.TryTake(out item, 500))
|
|
|
|
if (_queue.TryTake(out item, 500))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Interlocked.Increment(ref _tasks_in_progress);
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
{
|
|
|
|
handler(item);
|
|
|
|
handler(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
finally
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
Interlocked.Decrement(ref _tasks_in_progress);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (Exception ex)
|
|
|
|
catch (Exception ex)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Log.Error(ex, "[Multiprocessor.HandleThread]");
|
|
|
|
Log.Error(ex, "[Multiprocessor.HandleThread]");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}, stackSize);
|
|
|
|
}, stackSize);
|
|
|
|
t.IsBackground = true;
|
|
|
|
t.IsBackground = true;
|
|
|
|
_threads.Add(t);
|
|
|
|
_threads.Add(t);
|
|
|
@ -53,7 +63,7 @@ namespace ZeroLevel.Utils
|
|
|
|
public void Dispose()
|
|
|
|
public void Dispose()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_queue.CompleteAdding();
|
|
|
|
_queue.CompleteAdding();
|
|
|
|
while (_queue.Count > 0)
|
|
|
|
while (_queue.Count > 0 || _tasks_in_progress > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Thread.Sleep(100);
|
|
|
|
Thread.Sleep(100);
|
|
|
|
}
|
|
|
|
}
|
|
|
|