Priorität für Parallel.For-Schleife einstellen

Ok, hier ist die Situation: Mein Haupt- / UI-Thread (nenne ihn Thread1) wird zum Erfassen eines Stapels von Bildern von einem Phsycial Document Scanner verwendet. Wenn ein Stapel erfasst wurde, wird ein separater "Hintergrund" -Thread (als "Thread2" bezeichnet) gestartet, um die Bilder aus diesem Stapel zu verarbeiten und zu speichern.

Thread2 (der "Hintergrund" -Thread) verwendet aParallel.For Schleife, die die Bildverarbeitungs- / Zeitersparnis gegenüber einer normalen um 70% reduziertFor Schleife. Es scheint jedoch auch, dass alle meine Prozessoren ausgelastet sind, sodass Thread1 erst mit dem Erfassen weiterer Bilder beginnen kannParallel.For Endlosschleife

Gibt es eine Möglichkeit, aParallel.For Schleife, damit meine Prozessoren nicht voll werden? Oder um die Bearbeitungspriorität einzustellen? Ich habe versucht, Einstellungen vorzunehmenThread2.Priority = ThreadPriority.Lowest, aber dies scheint die Schleife nicht zu beeinflussen. Oder missverstehe ich, wie aParallel.For Schleife funktioniert? Blockiert es irgendwie Thread1?

Hier ist, wie ich den Thread2 von einer Methode in Thread1 aufrufe.

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 meinThreadWork 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
}

Antworten auf die Frage(5)

Ihre Antwort auf die Frage