我正在寻找像 ConcurrentQueue 这样的对象,如果队列为空,它允许我等待出队操作,因此我可以执行如下操作:
public static async Task ServiceLoop() {
var awaitedQueue = new AwaitedQueue<int>();
while (!cancelled) {
var item = await awaitableQueue.Dequeue();
Console.WriteLine(item);
}
}
Run Code Online (Sandbox Code Playgroud)
我已经编写了以下类,但是如果在调用 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 { …Run Code Online (Sandbox Code Playgroud)