【发布时间】:2011-12-13 09:30:30
【问题描述】:
我想知道是否存在ConcurrentQueue 的实现/包装器,类似于BlockingCollection,其中从集合中获取不会阻塞,而是异步的,并且会导致异步等待,直到将项目放入排队。
我提出了我自己的实现,但它似乎没有按预期执行。我想知道我是否正在重新发明已经存在的东西。
这是我的实现:
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);
}
}
}
【问题讨论】:
-
根据我们的 on-topic 指导,“有些问题仍然是题外话,即使它们属于上面列出的类别之一:...向我们提问的问题推荐或查找书籍、工具、软件库、教程或其他场外资源是题外话..."
-
我最近也想到了一个可以等待的队列(这是我的问题:stackoverflow.com/questions/52775484/…)!我相信它会解决微服务架构中的许多问题!但在这种情况下,队列可能应该是一个持久队列,而不是内存中的东西。
标签: c# asynchronous queue async-await .net-4.5