我想现有的转换过程中,它支持多线程和并发性,使解决方案的更多强大和可靠的方式。实现线程安全的,并行处理
采取紧急警报系统的例子。当工作人员开始工作时,将使用他们的信息创建一个新的收件人对象并将其添加到收件人集合中。相反,当它们输出时,对象被移除。在后台发生警报时,警报引擎将遍历相同的收件人列表(foreach),并在每个对象上调用SendAlert(...)。
下面是我的一些要求:
- 将接收者如果警报过程中不应该阻拦。
- 如果警报正在进行,删除收件人不应阻止。
- 添加或删除收件人应该不会影响通过正在进行的警报使用 收件人列表。
我一直在寻找任务和并行类以及BlockingCollection和ConcurrentQueue类,但我不清楚最好的方法是什么。
它是那样简单使用BlockingCollection?在阅读大量文档后,我仍然不确定如果在枚举集合时调用Add,会发生什么情况。
UPDATE
一个collegue叫我去下面的文章描述了ConcurrentBag类和每个操作的行为方式:根据作者的解释
http://www.codethinked.com/net-40-and-system_collections_concurrent_concurrentbag
,看来这个集合将(几乎)为我的目的服务。我能做到以下几点:
创建一个新的集合
VAR收件人=新ConcurrentBag();
当工人的时钟中,创建一个新的收件人,并将其添加到集合:
recipients.Add(新的收件人());
当发生警报时,警报引擎可以通过当时的集合,因为GetEnumerator的使用藏品的快照迭代。
的foreach(在收件人VAR收件人) recipient.SendAlert(...);
当工人的时钟输出,从集合中删除收件人:
???
的ConcurrentBag不提供一种方法来删除特定项目。据我所知,没有任何并发类。我错过了什么吗?除此之外,ConcurrentBag可以完成我所需要的一切。
这似乎是一个更清洁的选项。我会试一试! – SonOfPirate 2012-01-09 16:07:28