1

私は素晴らしいSmartThreadPoolを使用して、一連の解析タスクをキューに入れています。

基本的には、ユーザーが [開始] ボタンをクリックすると、プログラムはさまざまなリストをループし、それらのリストに基づいてさまざまなジョブを開始します (注: これは 500.000 ジョブになる可能性があります)。

私は次のように並んでいます。

 private void button1_Click(object sender, EventArgs e)
 {
     button1.Enabled = false;
     button2.Enabled = true;

     stpStartInfo.MaxWorkerThreads = Convert.ToInt32(parserThreadCount.Value);
     stpStartInfo.MinWorkerThreads = 1;
     _smartThreadPool2 = new Smart.SmartThreadPool(stpStartInfo);

     ........

     foreach (string engine in _checkedEngines)
     {
         query = lines[i];

         _smartThreadPool2.QueueWorkItem(
         new Amib.Threading.Func<string, string, int, int, int>(scrapeFunction),
         query, engine, iia, useProxies);

         iia++;
     }
}

したがって、問題は、200.000+ スレッドのようにキューに入れるときに、ユーザーが待機する必要がある (インターフェイスがほとんどハングする) ことです。

理想的な解決策は、すでにキューに入れられているスレッドを開始させ、残りをバックグラウンドでキューに入れる方法です..しかし、どうすればこれを達成できるかわかりません..

何か案は?:)

4

1 に答える 1

1

スレッドの 1 つを使用して、ジョブをキューに入れることができます。foreach を別のメソッドに移動し、メイン スレッドでキューに入れるだけです。キューイングを並行して行うにはこれで十分であり、完了すると、そのスレッドも SmartThreadPool によってリサイクルされ、キューに入れられたジョブに使用されます。

于 2012-11-29T10:18:37.640 に答える