对于BlockingCollection的Parallel.ForEach会在一段时间后停止阻塞

时间:2016-08-12 20:54:41

标签: c# parallel.foreach blockingcollection

我有一个Windows服务正在处理数据库队列表中的一些记录。队列记录的数量变化很大。有时候很多,有时候没有。此外,从队列处理记录所花费的时间长度变化很大。

我想实现一个生产者/消费者,以便记录的处理不会阻止检索要处理的其他队列记录。我的代码如下所示。如果我的服务在没有处理任何记录的情况下持续了5分钟左右,然后在数据库中显示了要处理的记录,则会将其检索,添加到集合中,并进行处理而不会出现问题。但是如果经过了更长的时间,比如30分钟,服务仍然存在,但不会接收或处理任何记录。

我的假设是,在某些时候,我的消费者会停止阻止,并且允许该方法失败,然后忽略后台生成器线程。

是否存在消费者停止阻止的时间间隔?或者代码中的其他内容被错误处理?

var recordsToRun = new BlockingCollection<T>();
//producer
Task.Run(async () =>
{
    while (true)
    {
        //go get the records

        foreach(var record in retrievedRecords)
        {
            recordsToRun.Add(record);

            await Task.Delay(100);
        }     
    }
});

//consumer
Parallel.ForEach(recordsToRun.GetConsumingPartitioner(), rec =>
    {
            //process the record
    });

0 个答案:

没有答案