0

我正在启动一个项目,程序将每 x 秒(比如 10 秒)轮询一次数据库并获取特定时间段内的行(基于日期时间字段)。对于每个民意调查,这可能是 0 - 40 行左右。在运行一些业务逻辑之后,这些行将被放入另一个数据库中。我最初的想法是会有一些逻辑将行(转换为对象)放在一个集合中,比如一个列表,并且列表有一个在添加项目时触发的事件。最后,将行放入dest。D B。

我是这样想的:

伪代码

private List<Person> PersonList;
public MyClassConst()
{
    PersonList = new List<Person>();
    PersonList.AddingEvent += HandleAddingEvent;
}
void HandleAddingEvent(...)
{
   // run business logic/rules
   // insert/update row in destination DB
}

void Timer_Elapsed()
{
   // query and convert to Person objects
   var personData = _personDao.GetPersons();

   for(int i=0; i< personData.Count; ++i)
   {
      PersonList.add(personData[i]);
   }
}

我担心的是,如果有 40 行,事件将被触发 40 次,这似乎并不理想。在将所有 40 个对象添加到列表中之前,我将如何禁用该事件。

如果有比使用列表更好的解决方案,请务必分享。

4

2 回答 2

1

好吧,您问题的技术答案就是使用ObservableCollection. 它有一个在修改集合时触发的事件。

但我认为这不是解决您的问题的适当解决方案。你真正拥有的是一个生产者/消费者队列。最好使用BlockingCollection.

将集合暴露给生产者和消费者。生产者可以将Add项目添加到集合中,而消费者可以将项目添加到集合中Take。该集合专门设计用于同时从多个线程访问,您不需要同步访问。

于 2013-05-23T20:20:26.493 回答
1

将您的列表更改为ObservableCollection<T>. 并订阅CollectionChanged事件,使用事件处理程序,您可以检查任何给定点可用的项目数量,并基于此触发 Db 插入逻辑。阅读更多

于 2013-05-23T20:22:09.683 回答