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
}
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.Forthread was NOT blocking Thread1 (yes, you were all right). HOWEVER, an object in Thread1 was trying to grab a newThreadfrom theThreadPoolwhile 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 optionScanInNewThread = truethat 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.Forloop) as long as they are not trying to grab more threads from theThreadPoolwhile the loop is going.