我使用的是生产者/消费者模式与System.Collection.Concurrent.BlockingCollection<DataTable
>,以从数据库中检索(生产者)数据和创建数据Lucene索引(消费者)。
生产者抓住10000只记录在一个时间,并增加了设定的BlockingCollection<DataTable>
。 消费者(这是有点慢)然后抓住那些10000和创建一个索引。
阻挡集合为界5 <DataTable>
的每万行。
起初,程序运行很好,但其获得约15行后,我发现我的电脑内存刷爆它减慢至爬行。
似乎BlockingCollection失败底层数组槽设置为null
的项目被取后。
码:
private static LuceneIndex index;
private static BlockingCollection<DataTable> blockingCol;
private static void Producer()
{
while (true)
{
//...get next 10000 rows
DataTable data = GetNextSet();
if(data.Row.Count > 0)
blockingCol.Add(products);
else
break;
}
}
private static void Consumer()
{
while (!BlockingCol.IsCompleted || BlockingCol.Count > 0)
{
DataTable data = blockingCol.Take();
index.UpdateIndex(GetLuceneDocs(data));
}
}
public static void Main(System.String[] args)
{
index = new LuceneIndex();
blockingCol = new BlockingCollection<DataTable>(2);
// Create the producer and consumer tasks.
Task Prod = new Task(Producer);
Task Con = new Task(Consumer);
// Start the tasks.
Con.Start();
Prod.Start();
// Wait for both to finish.
try
{
Task.WaitAll(Con, Prod);
}
catch (AggregateException exc)
{
Console.WriteLine(exc);
}
finally
{
Con.Dispose();
Prod.Dispose();
blockingCol.Dispose();
}
}
任何人都可以证实的拒绝这种悬挂? 而且没有任何解决办法?