异步队列操作

时间:2017-03-30 20:59:37

标签: c# asynchronous queue

我的队列每隔x秒就被新元素增加。

我想对队列中的每个项目执行操作。但我想"消费"在我继续下一个项目之前的一个项目。 每个项目都在进行异步调用,需要在转移到下一个项目之前完成。

我遇到问题而没有阻止应用程序。任何人都有一个如何做到这一点的例子?

1 个答案:

答案 0 :(得分:2)

这看起来相当简单。我假设一切都在一个线程上。如果事情在多个线程上,那么你会遇到一个稍微难点的问题,但不会太难。

class C
{
  bool busy = false;
  FancyQueue q;
  public C() 
  {
    q = new FancyQueue();
    q.Enqueued += HandleEnqueue;
  }
  Task HandleItem(Item x) { ... }
  async void HandleEnqueue() 
  {
    if (busy)
      return;
    busy = true;
    while (!q.Empty) 
      await HandleItem(q.Dequeue());
    busy = false;
  }
}

假设队列为空。不知怎的,一件新物品到了。调用事件处理程序。我们设置忙标志并提取项目,等待处理。我们返回消息循环。假设在我们等待的时候另一个物品到了。我们进入处理程序,但它被标记为忙,所以我们拯救;我们知道该物品将来会被处理。最后,第一个项目被处理,所以我们恢复事件处理程序,嘿,队列不是空的,所以我们继续前进;我们等待处理队列中的下一个项目。

一旦队列为空,我们将busy设置为false,并且事件处理程序的初始调用完成。

通过这个计划,我们在同一时间“永远不会”有两个出列的物品。请记住,“await”是工作流程中的一个点,工作流程在任务完成后才会继续