Многопоточная обработка большого массива через ThreadPool с возможностью остановки - C#
Формулировка задачи:
Добрый день!
Возникла такая задача. В массиве 200 тыс. строк. Их нужно обработать с помощью довольно быстрой функции с максимальной скоростью. Я использую ThreadPool для обработки:
Но мне нужно чтобы после выполнения операции появился MessageBox. То есть нужно подождать, пока не завершится обработка всех строк.
И здесь такая проблема. Раньше в подобных ситуациях я использовал:
Но получается, что на каждой строчке стоит ожидание Thread.Sleep(10), отчего обработка получается очень медленной.
Возможно ли как-то по-другому переписать этот код, чтобы была максимальная скорость и возможность дождаться конца обработки? Варианты с Foreach.Parallel или Task просьба не предлагать, мне нужно именно на ThreadPool.
foreach (string line in lines)
{
ThreadPool.QueueUserWorkItem(arg =>
{
CheckMulti((object)line);
});
}RunningWorkers = lines.count;
foreach (string line in lines)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(checkMulti), (object)file);
Thread.Sleep(10);
}
//ожидание threadpool
lock (WorkerLocker)
{
while (RunningWorkers > 0)
{
Monitor.Wait(WorkerLocker);
}
}
public void CheckMulti(object line)
{
//обработка строки
...
//
lock (WorkerLocker)
{
RunningWorkers--;
Monitor.Pulse(WorkerLocker);
}
}Решение задачи: «Многопоточная обработка большого массива через ThreadPool с возможностью остановки»
textual
Листинг программы
public static class ParallelExtender
{
public delegate TResult Func<in T, out TResult>(T arg);
public static TResult[] MapAsync<T, TResult>(this ICollection<T> collection, Func<T, TResult> func)
{
var result = new TResult[collection.Count];
var allDone = new ManualResetEvent(false);
int completed = 0;
int i = 0;
foreach (var item in collection)
{
T t = item;
int index = i;
ThreadPool.QueueUserWorkItem(_ =>
{
result[index] = func(t);
if (Interlocked.Increment(ref completed) == result.Length)
allDone.Set();
});
i++;
}
allDone.WaitOne();
return result;
}
}