动态队列和异步/等待

本文关键字:等待 异步 队列 动态 | 更新日期: 2023-09-27 18:31:19

试图让我思考如何在 C# 中正确编写一些使用队列的代码。

  • 队列包含一些初始项目
  • 取消排队,直到队列耗尽并调用异步函数
  • 异步函数可以将新项目排队
  • 需要继续运行,直到所有任务完成并且队列被清空

这是我写的一些伪代码:

Queue<string> queue = new Queue<string>();
static async Task SomeTask(item) {
    var newTask = await GenerateNewTask();
    if (newTask != null)
        queue.Enqueue(newTask);
}
static void Main() {
    while (queue.Count > 0) {
        SomeTask (queue.Dequeue());
    }
}

我正在为如何在这里编写我的 Main 函数而苦苦挣扎。队列将耗尽,但会添加新项目,因此这实际上不起作用。

动态队列和异步/等待

尝试在使用它时锁定队列。

.

NET 中的Queue<T>类型不是线程安全的,也不是生成者/使用者队列的最佳选择。

我建议您考虑BlockingCollection<T>BufferBlock<T>.