Ok, hier ist die Situation: Mein Haupt/UI-Thread (nennen wir es Thread1) wird verwendet, um einen Stapel von Bildern von einem physischen Dokumentenscanner zu erhalten. Wenn ein Stapel erfasst wurde, wird ein separater "Hintergrund" -Thread (nennen Sie ihn Thread2) gestartet, um die Bilder von diesem Stapel zu verarbeiten und zu speichern.Priorität für Parallel.For einstellen loop
Thread2 (der "Hintergrund" -Thread) verwendet eine Parallel.For
-Schleife, die die Bildverarbeitungs-/Speicherzeit um 70% gegenüber einer normalen For
-Schleife reduziert. Es scheint jedoch auch, alle meine Prozessoren zu maximieren, so dass Thread1 nicht mehr Bilder aufnehmen kann, bis die Parallel.For
Schleife abgeschlossen ist.
Gibt es eine Möglichkeit, eine Parallel.For
Schleife zu "begrenzen", so dass es meine Prozessoren nicht maximal macht? Oder um die Verarbeitungspriorität festzulegen? Ich habe versucht, Thread2.Priority = ThreadPriority.Lowest
Einstellung, aber dies scheint nicht auf die Schleife auswirken. Oder verstehe ich nicht, wie eine Parallel.For
Schleife funktioniert? Blockiert es Thread1 irgendwie?
Hier ist wie ich den Thread2 von einer Methode in Thread1 aufrufen.
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
}
Hier ist meine ThreadWork
Methode:
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
}
Sind Sie sicher, dass Thread 1 auf Gewinde 2 oder etwas nicht blockiert warten? Es wäre hilfreich, den Code zu sehen, was Thread 1 beim Warten macht. –
Bitte zeigen Sie uns Ihren Code. – SLaks
Das Festlegen der Priorität von thread2 wird keinen Unterschied machen, da Parallel.For auf Thread-Pool-Threads ausgeführt wird. –