我的队列每隔x秒就被新元素增加。
我想对队列中的每个项目执行操作。但我想"消费"在我继续下一个项目之前的一个项目。 每个项目都在进行异步调用,需要在转移到下一个项目之前完成。
我遇到问题而没有阻止应用程序。任何人都有一个如何做到这一点的例子?
答案 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”是工作流程中的一个点,工作流程在任务完成后才会继续 。