Tôi tự hỏi liệu có tồn tại/triển khai cho ConcurrentQueue, tương tự như BlockingCollection, nơi lấy từ bộ sưu tập không chặn, nhưng thay vì không đồng bộ và sẽ gây ra một async chờ đợi cho đến khi một mục được đặt trong xếp hàng.awaitable Task based queue
Tôi đã bắt đầu triển khai của riêng mình nhưng có vẻ như nó không hoạt động như mong đợi. Tôi tự hỏi liệu tôi có đang sáng tạo lại thứ gì đó đã tồn tại không.
Dưới đây là thực hiện của tôi:
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 yuck .... ...... –
@AdamSack: thực sự, nhưng nhận xét của bạn không giúp tôi. – spender