Это похоже на хороший вариант использования для распараллеливания
Вместо того, чтобы делать все подсчеты / и т.д., давайте просто позволим LINQ позаботиться об этом
Во-первых, давайте поместим логику вашего итератора в собственный метод, чтобы вы могли настроить его отдельно:
IEnumerable<uint> GetColors(byte[] rawImageBytes)
{
int lastTime = Environment.TickCount;
for (int i = 0; i < rawImageBytes.Length - 3; i += 3)
{
if (Environment.TickCount - lastTime > 10000)
{
setStatus(((i - lastCount)/10) + " checks per second");
lastTime = Environment.TickCount;
lastCount = i;
}
currentColor = (uint)((rawImageBytes[i] << 0) | (rawImageBytes[i + 1] << 8) | (rawImageBytes[i + 2] << 16));
yield return currentColor;
}
}
Теперь давайте немного переписаем ваш метод, используя PLINQ:
var results = (from color in GetColors(rawImageBytes).AsParallel()
group by color into g
select new { Color = g.Key, Count = g.Count()}).ToList();
var uniqueColours = results.Count();
var totalHits = results.Select(r=>r.Count()).Sum();
(написано без удобного компилятора, так что вам может понадобиться настроить его)
Посмотрите, как это происходит.