经过多个月与asp.net奋战后,现在转过来使用C#对上年项目进行的改进——将设计和模拟电话流程结合在一起。具体环境如下:
我需要为电话流程设计软件中的四十多个流程元素添加属性设置窗体。每一设置窗体都会从系统中一个唯一的变量池中获取系统变量。因为系统中只有唯一的一个变量池,所以我设计的变量获取窗体也应该只有一个对象实例。这个对象实例在变量池初始化的时候一同生成并一直贯穿整个系统的生存周期。每当流程元素要添加或修改其属性的时候,元素设置窗体会通知变量池管理器弹出变量获取窗体。变量获取窗体会列明所有在系统中有效的变量及正在有多少流程元素使用这一变量。用户可以根据自己的情况选择需要的变量。用户通过双击变量或者单击选择变量然后按OK来获取系统变量。在将选择的变量返回到调用窗口的时候我碰到了一些问题。我应该怎样将选择的值返回给对应的流程元素设置窗体呢?其实方法可以十分简单,但我在不理解的情况下使用了Event。我在变量获取窗体中定义了一个Event用于作为变量返回的路径。在元素设置窗体中定义变量获取函数去响应和处理这个Event,从中接收变量。本以为这个方法可行。但今日调试的时候发现一个重要的问题。也因为这个问题我了解到Event的一个行为特性:在面向对象中Evnet有类似广播的特性。
今天调试发现这么一个问题:四十多个元素有各自独立的属性设置窗体。照道理应该是互不相干的。但当一个元素设置窗体利用变量获取窗体去获取变量的时候,另一个元素设置窗体用于处理返回变量Event的函数竟然被调用了。这一行为令我感到非常困惑。于是我做了一个实验:在多个元素设置窗体负责处理返回变量Event函数处打上断点。结果是这些元素设置窗体负责处理返回变量的函数都有被调用到。感觉上变量获取窗体的返回变量Event将返回变量这一消息广播似地告诉所有与响应这一Event的流程元素。于是我上MSDN查了一下相关资料。事件具有以下特性:
1. 特殊类型的多路广播委托。
2. 事件的发行者(变量获取窗体)决定何时引发事件,而订阅者(元素设置窗体)确定执行何种操作(元素设置窗体中定义的Event处理函数)来响应事件。
3. 一个事件可以有多个订阅者(多个元素设置窗体)。一个订阅者可以处理来自多个发行者的多个事件(定义多个不同的Event处理函数)。
4. 没有订阅者的事件永远不会触发。
5. 事件通常用于通知用户操作,例如:图形用户界面中的按钮单击或菜单选择操作。
6. 如果一个事件有多个订阅者,当引发该事件时,会同步调用多个(订阅者各自的)事件处理程序。要异步调用事件,请参见使用异步调用同步法。
所以在我的情况中出现了广播的特性。但这算是一个错误。因为各自独立的元素设置窗体不应在获取变量时调用到其他元素的处理函数。这会带来很大的问题。在此写这些东西好好提醒自己这些重要和关键的信息!
参考网站
英文说明网址:http://msdn.microsoft.com/en-us/library/awbftdfh.aspx
中文说明网址:http://msdn.microsoft.com/zh-cn/library/awbftdfh.aspx
http://msdn.microsoft.com/zh-cn/library/8627sbea%28v=vs.80%29.aspx