小编Mar*_*had的帖子

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

我正在寻找像 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)

c# queue concurrency asynchronous

2
推荐指数
1
解决办法
2293
查看次数

标签 统计

asynchronous ×1

c# ×1

concurrency ×1

queue ×1