OK, oto sytuacja: Mój główny wątek/UI (nazywam go Wątek1) jest używany do pobierania partii obrazów z phsycial skanera dokumentów. Po pobraniu partii, oddzielny wątek "tła" (nazwij to wątek2) rozpoczyna przetwarzanie i zapisywanie obrazów z tej partii.ustaw priorytet dla Równoległy. Dla pętli
Wątek 2 ("wątek tła") korzysta z pętli Parallel.For
, która zmniejsza czas przetwarzania/oszczędzania obrazu o 70% w porównaniu do normalnej pętli For
. Wydaje się jednak, że maksymalizuje on wszystkie moje procesory, aby wątek1 nie mógł rozpocząć pobierania kolejnych obrazów, dopóki nie zakończy się pętla Parallel.For
.
Czy istnieje sposób na "ograniczenie" pętli Parallel.For
, aby nie maksymalizować procesorów? Lub, aby ustawić priorytet przetwarzania? Próbowałem ustawić Thread2.Priority = ThreadPriority.Lowest
, ale nie ma to wpływu na pętlę. Czy nie rozumiem, jak działa pętla Parallel.For
? Czy w jakiś sposób blokuje Thread1?
Oto jak nazywam wątek2 z metody w wątku1.
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
}
Oto moja ThreadWork
metoda:
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
}
Czy na pewno gwintu 1 nie jest zablokowany czekając na gwincie 2 albo coś? Przydałoby się zobaczyć kod tego, co wątek 1 robi podczas oczekiwania. –
Pokaż nam swój kod. – SLaks
Ustawienie priorytetu wątku2 nie będzie miało znaczenia od czasu równoległego. Działa na wątkach puli wątków. –