我有一个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
});