C# · 12月 26, 2021

c# – 任何人都有这样使用Blackboard Pattern的想法?

有人对“实用程序员”第165页的黑板概念有什么想法吗?

我想要有几个小型的子系统(DLL和EXE),主要是彼此独立的.有一些程序集将被所有EXE使用.这些程序集几乎都使用相同的数据库.而不是使用界面来进行这些程序集之间的通信,Blackboard类型模式不会提供更多的独立性?

我在想一些通过事件通知的调解器类型的构造,所有的子系统通信都通过它.这使得syb系统非常独立.调解员将持有应广播的所有通知的名称.然后,用户将以名称来听特定的事件,但总是订阅相同的(或者可能通过名称作为参数)mediator事件.

这里有更多的讨论:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_22829492.html

解决方法 黑板的概念是,多个独立的进程运行和更新黑板,因为它们制作了它的一部分.一个典型的例子是语音识别.输入数据是要识别的音频.音频可以被分割,并且多个线程开始将片段匹配到单词.当每个线程找到匹配的单词时,他们将翻译的黑板更新到此为止.随着短语开始组装,另一个线程可以进行语法检查,以验证各种识别器线程正在进行的选择.如果一个词的信心低,违反了语法,那么该片可以重新运行寻找替代品.这甚至可能导致重新分割音频数据作为静音和暂停被解决.

随着短语成为句子,可以采取更大的观点,并且可以解决同音词(对,对)的各种选项.所有这一切都是通过将黑板打开到所有进程来完成的,并且“锁”仅在各种结果滚动时被应用.

使用数据库作为您的黑板有一定的意义,因为您获得免费的交易,但这取决于数据的更新和重新读取的积极性.如果发生很快,往返行程会相加,使内存结构更加合理.

您的调解者的想法是有道理的,因为它创建了一个单一的锁点,而黑板算法很少遇到A-&B; B> A风格的死锁,因为他们要求所有的数据元素在前面.除此之外,放弃锁定不是一个很大的惩罚,因为各种子任务将随着数据滚动而重新启动.当他们拥有的数据已经过时时,需要通知董事会的订阅者,这可以通过使用最新数据重新启动任务的回调来完成.

就工作流的评论而言:这里的主要区别在于,大多数工作流由主进程进行协调,该进程采用刚刚输入的状态,并决定哪些状态可用于数据移动.虽然可能有独立的演员,但他们很少通过创造更好的结果(其他任务将使用)相互参与“超越”.换句话说,一个工作流通常是一组数据非常有限的数据,而黑板几乎是一个独立的活动的空闲. (也就是说,黑板可能在你的工作流程之后:http://sunsite.informatik.rwth-aachen.de/Publications/CEUR-WS/Vol-247/FORUM_15.pdf)

我不能想到我看到的模式的任何C#示例,我做的工作类型没有太多的调用(计算是确定性的).做一些搜索查找其他语言的参考,但没有一个看起来很好的.