在注册处理期间,subscriber被分配一个独特的标记,用来在event channel中标识subscriber。event channel也使用这个标记索引那些subscriber。 虽然样品应用作为标记目标的杂乱脉冲干扰电码使用,我推荐在你的自己的程序里使用另一个方法产生一个独特的标识符 ( 例如产生一guid)。
使用目录菜单建立3到4个frmlist窗口实例。使用新的目录菜单选项创作frmlist 的3 或者4 个实例,然后在其中一个窗口中选择一个条目,双击这个条目进入可编辑模式,键入一个新的名字。窗体建立一个描述数据更新的事件并通过event channel发送。
private sub lvwlist_afterlabeledit(byval sender as _ object,
byval e as _ system.windows.forms.labelediteventargs) _
handles lvwlist.afterlabeledit
dim objevent as clsdataevent
if e.label <> "" then
objevent = new clsdataevent()
with objevent
.name = "namechanged"
.value = e.label
.extradata = lvwlist.items(e.item).tag
.origin = me
end with
mybase.eventchannel.publishevent(objevent)
end if
end sub
发送事件的窗体证实它是事件的创始人;并将clsdataevent类的origin属性设置为它自己。这样可以阻挡其他多余的事件,以确保发送者接收到的事件都是已经发布过的。最后,事件的发布者注意到了数据的改变。
所有的subscribers将收到事件。在eventapp 中,每个frmlist 的实例将收到事件并且改变每个listview中的发生变化的项目:
public overrides sub eventraise( _ byval newevent as _
eventapp.clsevent)
dim objlistitem as listviewitem
select case newevent.name
case "namechanged"
for each objlistitem in lvwlist.items
if objlistitem.tag = newevent.extradata then
objlistitem.text = newevent.value
end if
next
case else
handle other events
end select
end sub
这种事件系统类型将给你带来很大的灵活性。你可以使在应用程序中的任何一个
对象发布事件,只有那些对此感兴趣的对象的到更新的信息。也可以改变event
channel类的实现方式, 如可以通过使用web service或者消息系统(如ms
message queue 或者 ibm mq 系列),通过 http协发送事件。