在数字信号采集系统中,通常一个线程将数据推送到系统中的观察者。从Wikipedia/Observer_pattern多线程观察器的设计模式
例如:
foreach (IObserver observer in observers)
observer.Update(message);
当例如来自例如用户的动作一个GUI线程需要数据停止流动,你想打破主题观察者连接,甚至将观察者全部处理掉。
有人可能会说:你应该停止数据源,然后等待一个标记值来处理连接。但是这会在系统中产生更多的延迟。
当然,如果数据抽取线程刚刚要求观察者的地址,它可能会发现它正在向被销毁的对象发送消息。
有人创建了一个“官方”设计模式来对付这种情况吗?他们不应该吗?
我在这里很困惑。你想避免什么?你是在谈论一个线程想要注销一个观察者的情况,但另一个线程正在迭代所有观察者? – 2008-09-19 16:43:18
我不知道你实现了`IObserver`的具体类是什么,但如果“更新”的意思是“做任何你需要做的事情来使自己更新数据源”,那么处置对象的正确行为将是默默无闻。如果有一个对象与每个观察者相关联,表明它是否应该继续接收订阅,并且如果抽吸对象具有标志,该标志指示自从上次扫描它们以来是否有任何此类对象请求取消订阅,则抽取线程可以轮询对象以取消抽取需要的时候。 – supercat 2013-01-27 22:17:17