【问题标题】:How to manage worker thread who wait until they have work to do?如何管理等到有工作要做的工作线程?
【发布时间】:2010-09-29 09:56:41
【问题描述】:

我有一个执行以下操作的程序:

  1. 调用 web 服务(对同一个 web 服务有很多调用)

  2. 处理1的结果。

  3. 在数据库中插入 2. 的结果

所以我认为做一些多线程应该会更好。我想我可以这样做:

  • 一个线程是master(我们称之为A)

  • 它创建了一些调用 web 服务的线程(我们称之为 W)

  • 当 W 有一些结果时,它会将其发送给 A(或 A 检测到 W 有一些东西)

  • A 将结果发送到某个计算线程(我们称之为 C)

  • 当 C 有一些结果时,它会将其发送给 A(或 A 检测到 C 有一些东西)

  • A 将结果发送到某个数据库线程(我们称之为 D)

所以有时 C 或 D 会等待工作完成。

通过这种技术,我将能够为每个任务设置线程号。

你能告诉我我该怎么做吗,如果有任何模式的话。 编辑:我添加了“some”而不是“a”,所以我会为一些耗时的过程创建许多线程,也许最快的可能只有一个。

【问题讨论】:

    标签: c# .net multithreading .net-2.0


    【解决方案1】:

    在我看来,您可以使用生产者/消费者模式。使用 .NET 4,这变得非常容易实现。启动多个Tasks 并使用BlockingCollection<T> 作为任务之间的缓冲区。详情请查看this post

    【讨论】:

    • 我编辑了我的标签:我使用 .net 2.0。但我会看看你的解决方案,看看它是否能给我一些想法。
    • 那篇关于生产者/消费者模式的 MSDN 文章确实需要删除。它具有不正确的模式实现。它很容易被活锁。这里的危险信号是使用AutoResetEvent 来表示新项目已经到货。实际上不可能使用这种机制正确实现该模式,因为在消费者醒来提取物品后信号立即丢失(重置)。但是,如果队列中有多个项目会发生什么?活锁!
    • @Brian Gideon:感谢您的更新。我已经删除了链接。老实说,我只是想提供 .NET 4 方法的替代方案。我必须找到替代描述。
    • @Brian Rasmussen:澄清一​​下……我并不是说它应该远离你的帖子。我的意思是微软需要让它消失。或者至少修复它:)
    • @Brian Gideon:我明白,但没有理由将人们指向问题的方向。
    【解决方案2】:

    在 .net 中你有一个线程池。

    当你释放一个线程时,它实际上并没有关闭,它只是回到线程池中。当您打开一个新线程时,您会从线程池中获得一个。

    如果长时间不使用,线程池会关闭它们。

    【讨论】:

      【解决方案3】:

      我将启动两个计时器,它们将在单独的 ThreadPool 线程上触发它们的事件处理程序。第一个计时器的事件处理程序将检查 Web 服务的数据,如果找到一些数据,将其写入Queue<T>,然后返回睡眠状态直到下一个间隔。

      第二个计时器的事件处理程序读取队列并更新数据库,然后休眠直到下一个时间间隔。两个事件处理程序都应该将对队列的访问包装为 lock 以管理并发。

      具有独立间隔的独立计时器可以让您将数据可用时与将其插入数据库所需的时间分离,队列充当缓冲区。由于通用队列可以动态增长,即使数据库有一段时间不可用,您也可以获得一些喘息的空间。第二个事件处理程序甚至可以产生多个线程来同时插入多个记录或镜像数据库。事件处理程序还可以将更新发布到日志文件或用户界面,以帮助您监控活动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 2020-08-26
        • 2011-11-25
        • 2017-10-07
        • 1970-01-01
        相关资源
        最近更新 更多