我的应用程序适用于带有字符串的队列(对应于应用程序需要执行的不同任务)。在随机的时刻,队列可以填充字符串(有时候每分钟几次,但也可能需要几个小时。
直到现在我总是有一个计时器,每隔几秒检查队列中是否有队列中的项目并将其删除。
我认为必须有一种比这种方式更好的解决方案。有什么方法可以在项目添加到队列时获得事件吗?
答案 0 :(得分:5)
是。看看TPL Dataflow,特别是BufferBlock<T>
,它与BlockingCollection
大致相同,没有通过利用{{1}来阻塞线程的令人讨厌的副作用}。
所以你可以:
async/await
答案 1 :(得分:2)
我会看一下BlockingCollection.GetConsumingEnumerable。默认情况下,该集合将使用队列进行备份,这是一种在使用简单的foreach
循环添加队列时自动从队列中获取值的好方法。
还有overload允许您提供CancellationToken
,这意味着您可以干净地突破。
答案 2 :(得分:1)
你看过BlockingCollection
了吗? GetConsumingEnumerable()
方法允许在消费者上运行无限循环,一旦项目可用就会产生新项目,而不需要计时器,或Thread.Sleep's
:
// Common:
BlockingCollection<string> _blockingCollection =
new BlockingCollection<string>();
//制片人
for (var i = 0; i < 100; i++)
{
_blockingCollection.Add(i.ToString());
Thread.Sleep(500); // So you can track the consumer synchronization. Remove.
}
//消费者:
foreach (var item in _blockingCollection.GetConsumingEnumerable())
{
Debug.WriteLine(item);
}