Me pregunto si existe una implementación/envoltura para ConcurrentQueue, similar a BlockingCollection donde tomar de la colección no bloquea, sino que es asincrónico y provocará una asincronía hasta que se coloque un elemento en el cola.espera Cola basada en tareas
He creado mi propia implementación, pero parece que no está funcionando como se esperaba. Me pregunto si estoy reinventando algo que ya existe.
Aquí está mi aplicación:
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);
}
}
}
oh asco .... ...... –
@ AdamSack: de hecho, pero su comentario no me ayuda. – spender