gpt4 book ai didi

c# - C# 中是否有类似 ConcurrentQueue 的数据结构,它允许我等待一个空队列,直到添加一个项目?

转载 作者:行者123 更新时间:2023-12-05 09:13:26 33 4
gpt4 key购买 nike

<分区>

我正在寻找一个像 ConcurrentQueue 这样的对象,它允许我在队列为空时等待出队操作,这样我就可以执行如下操作:

public static async Task ServiceLoop() {

var awaitedQueue = new AwaitedQueue<int>();

while (!cancelled) {
var item = await awaitableQueue.Dequeue();
Console.WriteLine(item);
}

}

我已经编写了以下类,但是如果在调用 Dequeue 和新等待者入队之间将一个项目添加到队列中,将会发生可怕的事情。

public class AwaitedQueue<T> : IDisposable {

ConcurrentQueue<TaskCompletionSource<T>> awaiters = new ConcurrentQueue<TaskCompletionSource<T>>();

ConcurrentQueue<T> items = new ConcurrentQueue<T>();

public AwaitedQueue() { }

public void Enqueue(T item) {
if (!awaiters.TryDequeue(out TaskCompletionSource<T> awaiter)) {
this.items.Enqueue(item);
} else {
awaiter.SetResult(item);
}
}

public async Task<T> Dequeue() {
if (items.TryDequeue(out T item)) {
return item;
} else {
// If an item is enqueued between this call to create a new TaskCompletionSource.
var awaiter = new TaskCompletionSource<T>();
// And this call to actually enqueue, I believe it will cause me problems.
awaiters.Enqueue(awaiter);
return await awaiter.Task;
}
}

public void Dispose() {
while (awaiters.TryDequeue(out TaskCompletionSource<T> awaiter)) {
awaiter.SetCanceled();
awaiter.Task.Wait();
}
}
}

我确信这个概念的稳健且经过良好测试的实现已经存在,但我不知道我需要在 Google 中输入哪种英文单词组合才能找到它。

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com