System.Collections.Concurrent中有一些新的集合,非常适用于多线程环境。但是它们有点受限制。要么它们会阻塞直到有一个项目可用,要么它们会返回default(T)(TryXXX方法)。
我需要一个线程安全的集合,但不是阻塞调用线程,而是使用回调通知我至少有一个项目可用。
我的当前解决方案是使用BlockingCollection,但使用带有委托的APM来获取下一个元素。换句话说,我创建了一个指向从集合中Take的方法的委托,并使用BeginInvoke执行该委托。
不幸的是,我必须在我的类中保留很多状态才能实现这一点。更糟糕的是,这个类不是线程安全的;它只能被单个线程使用。我正在维护性的边缘上,我希望不要这样做。
我知道有一些库可以使我在不添加任何引用外部版本4框架的情况下轻松完成我在这里所做的事情(我相信反应框架就是其中之一),但我希望实现我的目标而不添加任何引用。
是否有任何更好的模式可以使用,而不需要外部引用,以实现我的目标?
简而言之:
是否有满足以下要求的模式:
“我需要向集合发出信号,表明我已准备好下一个元素,并在下一个元素到达时使集合执行回调,而不会阻塞任何线程。”
我需要一个线程安全的集合,但不是阻塞调用线程,而是使用回调通知我至少有一个项目可用。
我的当前解决方案是使用BlockingCollection,但使用带有委托的APM来获取下一个元素。换句话说,我创建了一个指向从集合中Take的方法的委托,并使用BeginInvoke执行该委托。
不幸的是,我必须在我的类中保留很多状态才能实现这一点。更糟糕的是,这个类不是线程安全的;它只能被单个线程使用。我正在维护性的边缘上,我希望不要这样做。
我知道有一些库可以使我在不添加任何引用外部版本4框架的情况下轻松完成我在这里所做的事情(我相信反应框架就是其中之一),但我希望实现我的目标而不添加任何引用。
是否有任何更好的模式可以使用,而不需要外部引用,以实现我的目标?
简而言之:
是否有满足以下要求的模式:
“我需要向集合发出信号,表明我已准备好下一个元素,并在下一个元素到达时使集合执行回调,而不会阻塞任何线程。”
Take
出一个物品,并且该物品是传递给EndInvoke的object
。总体目标有点复杂;基本上我必须使工作流程处于空闲状态,直到物品变得可用。您不能阻止工作流程的执行,因此仅仅Take
一个物品是行不通的,因为调用会被阻塞。我必须创建一个书签,然后将其传递给扩展程序。扩展程序调用委托,在回调中恢复书签。 - user1228