500.000ish リストを実行する for ループがあります。これらのそれぞれについて、SmartThreadPool ジョブをキューに入れています。
lines.Length
以下には500.000ishのアイテムが含まれています。
私の問題は、それらを一度にキューに入れるとメモリの問題が発生することです..だから私はこれを防ぐためのロジックを書きます:
int activeThreads = _smartThreadPool2.ActiveThreads;
if (activeThreads < maxThreads)
{
int iia = 0;
for (int i = 0; i < lines.Length; i++)
{
if (doNotUseAdditive.Checked == true)
{
foreach (string engine in _checkedEngines) // Grab selected engines
{
query = lines[i];
_smartThreadPool2.QueueWorkItem(
new Amib.Threading.Func<string, string, int, int, int>(scrape),
query, engine, iia, useProxies);
iia++;
}
}
}
}
else
{
// Wait
wait.WaitOne();
}
問題は、for ループ内でその if ステートメントを実行できないことです。これは、戻ってきたときにループ内の場所を覚えていないためです。
私は使用しています:
ManualResetEvent wait = new ManualResetEvent(false); //global variable
「一時停止・再開」へ
Xスレッドが使用された後、何らかの方法でループを一時停止し、スレッドが使用可能になったら戻ってループを続行する必要があります。
何か案は?