使用.NET 2.0的非阻塞生产者和使用者

时间:2011-06-02 20:03:01

标签: multithreading c#-2.0

在我们的场景中,

  • 消费者需要至少半秒才能完成一个流程循环(针对数据表中的一行)。
  • 生产者每秒至少生产8件物品(不用担心,我们不介意消费的持续时间)。
  • 共享数据只是一个数据表。
  • 我们永远不应该要求制作人等待(因为它是服务器,我们不希望它等待这个)

如何在不锁定数据表的情况下实现上述目标(因为我们不希望生产者以任何方式等待)。

我们无法在我们的组织中使用.NET 4.0。

3 个答案:

答案 0 :(得分:1)

在“生产者/消费者队列”部分的this page处使用监视器的生产者/消费者队列有一个很好的例子。为了同步对底层数据表的访问,您可以拥有一个使用者。

该页面可能是网上.NET中线程化的最佳资源。

答案 1 :(得分:0)

创建一个缓冲区,用于在处理数据时保存数据。

处理需要半秒钟,而你每秒可以获得8件物品......除非你有至少4个处理器,否则你会遇到问题。

为了安全起见,我需要使用至少两倍所需的缓冲区(16行),并确保可以使用硬件。

答案 2 :(得分:0)

没有灵丹妙药可以让你从多个线程访问DataTable而不使用阻塞同步机制。我要做的是尽可能短的持有锁。请记住,修改数据表层次结构中的任何对象都需要锁定整个数据表。这是因为修改DataRow 上的列值可以更改父DataTable内的内部索引结构。

所以我要做的是从制作人获得一个锁,添加一个新行,并释放锁。然后在conumser中,您将获得相同的锁,将DataRow中包含的数据复制到单独的数据结构中,然后立即释放锁。现在,您可以在没有同步机制的情况下操作复制的数据,因为它是隔离的。完成操作后,您将再次获取锁定,将更改合并回DataRow,然后释放锁定并重新开始此过程。