set priority for Parallel.For loop
c#, task-parallel-library
Solution
OK, I figured it out! I'm only posting this in case someone ever inadvertantly has this happen to them...
It turns out that the `Parallel.For` thread was NOT blocking Thread1 (yes, you were all right). HOWEVER, an object in Thread1 was trying to grab a new `Thread` from the `ThreadPool` while the loop was crunching away, and thus the "delay" occured. I'm using a 3rd party SDK that allows me to interact with the TWAIN interface and there was an option `ScanInNewThread = true` that was attempting to grab a new thread each time the user started a new scan (which was occuring while the loop was crunching away). I was able to change this so that a single (but still separate) thread is used throughout an application session instead of grabbing a new thread for each scan batch, and BANG, no more noticeable delay.
SO - the moral of the story:
Existing threads should still function "normally" (with the exception of the thread calling the `Parallel.For` loop) as long as they are not trying to grab more threads from the `ThreadPool` while the loop is going.
Problem
Ok, here's the situation: My main/UI thread (call it Thread1) is used for acquiring a batch of images from a phsycial document scanner. When a batch has been acquired, a separate "background" thread (call it Thread2) starts up to process and save the images from that batch. Thread2 (the "background" thread) is using a `Parallel.For` loop which reduces the image processing/saving time by 70% over a normal `For` loop. However, it also appears to be maxing out all of my processors so that Thread1 can not start acquiring any more images until the `Parallel.For` loop completes. Is there a way to "limit" a `Parallel.For` loop so that it does not max out my processors? Or to set the processing priority? I tried setting `Thread2.Priority = ThreadPriority.Lowest`, but this does not appear to affect the loop. Or am I misunderstanding how a `Parallel.For` loop works? Is it blocking Thread1 somehow? Here is how I call the Thread2 from a method in 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 } ``` Here is my `ThreadWork` method: ``` 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 } ```