
120
|
第
9
章
int
item;
try
{
item =
await
_asyncQueue.DequeueAsync();
}
catch
(InvalidOperationException)
{
break
;
}
Trace.WriteLine(item);
}
讨论
建议对异步生产者队列(或消费者队列)尽可能使用通道。除了节流,它们有多种采样选
项,并且已经高度优化。然而,如果应用程序逻辑可以通过数据流经的管道来表达,则
TPL
数据流或许更适用。最终的选项是
AsyncProducerConsumerQueue<T>
,如果应用程序已
经使用了
AsyncEx
中的其他类型,那么就可以使用这个选项。
可以从
System.Threading.Channels
NuGet
包中获取通道,从
System.Threading.
Tasks.Dataflow
NuGet
包中获取
BufferBlock<T>
类型,从
Nito.AsyncEx
NuGet
包中获取
AsyncProducerConsumerQueue<T>
类型。
参阅
9.6
节探讨带有阻塞语义而非异步语义的生产者队列(或消费者队列)。
9.7
节探讨阻塞栈和阻塞背包。
9.12
节探讨兼具阻塞语义和异步语义的生产者队列(或消费者队列)。
9.9
节流队列
问题
假设有一个生产者队列(或消费者队列),生产者可能比消费者运行得快,这会造成不必
要的内存使用。同时,因为你希望保留所有的队列项,所以需要设法节流生产者。
解决方案
当使用生产者队列或消费者队列时,除非你能够确定消费者始终比生产者运行得快,否则 ...