我有两种方法(在C#中):

List<Pizza> CookPizza(List<Order>);
List<HappyCustomers> DeliverPizza(List<Pizza>);

这些操作没有共同的对象(除了从一个传递到另一个的披萨外),而且是线程安全的。他们每个人都需要花费几秒钟来执行,并且每个人都使用不同的资源(烤箱与汽车)。因此,我想同时运行它们。

如何组织具有以下约束的线程:
  • 我一开始就知道所有订单(例如,我有100,000个)。一个订单可以包含多个比萨饼,在这些比萨饼煮熟之前,我不知道任何订单中有多少个比萨饼。 (我知道)。通常,一个订单有1个披萨,但最多可以有10个。
  • 有效比萨饼的数量通常不应超过100。这包括新鲜烹制的比萨饼和正在交付的比萨饼。这是一个软限制,所以我可以超出一些限制(例如,当大订单煮熟时)。硬限制可能接近500。
  • 在进行大量工作时,这两种操作都效率更高。通常,当获得至少20个订单时,CookPizza效率最高。送给至少50个披萨时,送披萨效率最高。就是说,如果我给那些方法提供的项目少于这些数量,我将看到性能下降。如果仅剩这些,那么使用较少的项目就可以了。

  • 我正在努力解决的主要问题是方法可能需要如何彼此等待。
  • DeliverPizza可能需要等待CookPizza完成50。
  • CookPizza可能需要等待DeliverPizza才能将 Activity Pizza的数量减少到100。
  • 最佳答案

    首先,我将使用基于事件的模型来解决此问题。

    假设我们有一个PizzaDispatcher对象,该对象已获得订单。调度程序从初始空状态开始,以一定数量的订单调用CookPizza。比萨饼煮熟后,CookPizza函数会通知调度程序比萨饼已经煮熟(也许通过您作为参数提供的回调)。比萨送达时,DeliverPizza函数执行相同的操作。
    PizzaDispatcher现在将具有足够的信息,可以根据煮熟的比萨饼的数量和未交付的数量来决定何时以及多少比萨饼需要上交 cooking 或交付。

    可以将其重构为使用事件而不是回调等,但是我将其发布的目的是想法,而不是实现的细节。

    关于c# - 披萨,线程,等待,通知。这是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5621282/

    10-11 02:01