awaitable Tâche de la file d'attente

Je me demandais si il existe une mise en œuvre/wrapper pour ConcurrentQueue, semblable à BlockingCollection où la prise de la collection ne se bloque pas, mais est plutôt asynchrone et va provoquer une async attendent jusqu'à ce qu'un élément est placé dans la file d'attente.

Je suis venu avec ma propre mise en œuvre, mais il ne semble pas fonctionner comme prévu. Je me demande si je suis réinventer quelque chose qui existe déjà.

Voici mon oeuvre:

public class MessageQueue<T>
{
    ConcurrentQueue<T> queue = new ConcurrentQueue<T>();

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

    object queueSyncLock = new object();

    public void Enqueue(T item)
    {
        queue.Enqueue(item);
        ProcessQueues();
    }

    public async Task<T> Dequeue()
    {
        TaskCompletionSource<T> tcs = new TaskCompletionSource<T>();
        waitingQueue.Enqueue(tcs);
        ProcessQueues();
        return tcs.Task.IsCompleted ? tcs.Task.Result : await tcs.Task;
    }

    private void ProcessQueues()
    {
        TaskCompletionSource<T> tcs=null;
        T firstItem=default(T);
        while (true)
        {
            bool ok;
            lock (queueSyncLock)
            {
                ok = waitingQueue.TryPeek(out tcs) && queue.TryPeek(out firstItem);
                if (ok)
                {
                    waitingQueue.TryDequeue(out tcs);
                    queue.TryDequeue(out firstItem);
                }
            }
            if (!ok) break;
            tcs.SetResult(firstItem);
        }
    }
}
  • Selon notre thème conseils, "Quelques questions sont toujours hors-sujet, même si elles s'inscrivent dans l'une des catégories énumérées ci-dessus:...Questions nous demandant de recommander ou trouver un livre, un outil, une bibliothèque de logiciels, tutoriel ou d'autres ressources de site sont hors-sujet..."
  • Une attendent-mesure de la file d'attente est ce que j'ai pensé récemment encore (voici ma question: stackoverflow.com/questions/52775484/...)! Il permettrait de résoudre BEAUCOUP de problèmes dans un microservices architecture, je crois! Mais dans ce cas, la file d'attente devrait probablement être une file d'attente persistante et non pas quelque chose en mémoire.
  • Connexes: Est-il quelque chose comme asynchrone BlockingCollection<T>?
InformationsquelleAutor spender | 2011-10-23