わかりました。状況は次のとおりです。メイン/UIスレッド(Thread1と呼びます)は、物理ドキュメントスキャナーから画像のバッチを取得するために使用されます。バッチが取得されると、別の「バックグラウンド」スレッド(Thread2と呼ばれます)が起動して、そのバッチからの画像を処理および保存します。
Thread2(「バックグラウンド」スレッド)はParallel.For
、通常のループよりも画像処理/保存時間を70%短縮するループを使用していFor
ます。Parallel.For
ただし、ループが完了するまでThread1がそれ以上画像の取得を開始できないように、すべてのプロセッサが最大になっているようにも見えます。
ループを「制限」Parallel.For
して、プロセッサが最大にならないようにする方法はありますか?または、処理の優先順位を設定するには?設定Thread2.Priority = ThreadPriority.Lowest
してみましたが、ループに影響がないようです。Parallel.For
それとも、ループがどのように機能するかを誤解していますか?どういうわけかThread1をブロックしていますか?
これが、Thread1のメソッドからThread2を呼び出す方法です。
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
}
これが私のThreadWork
方法です:
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
}