definir prioridade para Parallel.For loop
Ok, aqui está a situação: Meu thread principal / UI (chame-o Thread1) é usado para adquirir um lote de imagens de um scanner de documentos phsycial. Quando um lote tiver sido adquirido, um thread de "segundo plano" separado (chame-o de Thread2) será iniciado para processar e salvar as imagens desse lote.
Thread2 (o thread "background") está usando umParallel.For
loop que reduz o tempo de processamento / economia de imagem em 70% em relação a umFor
loop. No entanto, ele também parece estar maximizando todos os meus processadores para que Thread1 não possa começar a adquirir mais nenhuma imagem até que oParallel.For
loop completo.
Existe uma maneira de "limitar" umParallel.For
loop para que não ultrapasse os meus processadores? Ou para definir a prioridade de processamento? Eu tentei definirThread2.Priority = ThreadPriority.Lowest
, mas isso não parece afetar o loop. Ou eu estou entendendo mal comoParallel.For
loop funciona? Está bloqueando o Thread1 de alguma forma?
Aqui está como eu chamo o Thread2 de um método no Thread1.
public void SaveWithSettings(bool save) // method in Thread1
{
....
Thread thr = new Thread(ThreadWork); // creating new thread (Thread 2)
thr.Priority = ThreadPriority.Lowest; // does nothing?
thr.Start(new SaveContainer(sc)); // pass a copy as paramater
// misc stuff to make scanning possible again
numBgw++;
twain.RemoveAllImages(); // clear images
imagelist.Clear(); // clear imagelist images
.... // etc. this all appears to process fine while Thread2 is processing
}
Aqui está o meuThreadWork
método:
private void ThreadWork(object data) // executing in Thread2
{
SaveContainer sc = data as SaveContainer; // holds images
bool[] blankIndex = new bool[sc.imagelist.Count]; // to use in Parallel.For loop
for (int i = 0; i < sc.imagelist.Count; i++)
blankIndex[i] = false; // set default value to false (not blank)
Parallel.For(0, sc.imagelist.Count, i => // loop to mark blank images
{
bool x = false; // local vars make loop more efficient
x = sc.IsBlankImage((short)i); // check if image at index i is blank
blankIndex[i] = x; // set if image is blank
}
.... // other image processing steps
}