我正在使用精彩的SmartThreadPool
来排队一堆解析任务。
基本上,当用户点击按钮Start时,程序将循环遍历不同的列表,并根据这些列表启动不同的作业(注意:这可能是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+个线程时必须等待(接口几乎挂起)..
理想的解决方案是让一个已经排队的线程开始,然后在后台排队其余的方法..但不知道我怎么能做到这一点..
有什么想法吗? :)
答案 0 :(得分:1)
您可以使用其中一个线程对作业进行排队。只需将foreach移动到一个单独的方法并将其排入主线程。这足以同时进行排队,当它完成时,它的线程也将被SmartThreadPool回收并用于排队的作业。