所有
这个问题来自我目前正在使用的C#项目。在解决方案中,它包括三个项目,一个是UI项目,另一个是界面项目,第三个是组件项目。我的解决方案的基本思想是UI项目可以动态加载继承接口项目中定义的接口的组件DLL。在界面项目中,我定义了两个类,一个是UI项目用于动态加载DLL的接口,该接口定义了组件对象中的所有曝光实体。除了这个接口之外,还有另一个继承公共接口的抽象组件核心类,它包括实际组件对象中的所有常见操作。我之前画了一个情节来描述我的解释。
" UI类--->接口< ---抽象组件核心< ---实际组件"
在我的设计中,我在抽象组件核心对象中使用C#BackgroundWorker。 BackgroundWorker包含两个事件ProgressChanged和RunWorkerCompleted。在我的设计理念中,这两个事件应该由UI Class注册。例如,UI类可以在组件的后台工作进程改变或操作完成时注册其操作。另一件事是我不想将Component Core中的BackgroundWorker对象暴露给UI类,因此BackgroundWorker对象在抽象组件核心中定义,而不是在接口中定义。所以在我的原始设计中,我在接口中创建了两个事件,它接受与BackgroundWorker的两个事件相同的事件处理程序。如下:
event EventHandler<ProgressChangedEventArgs> ProcessChanged;
event EventHandler<RunWorkerCompletedEventArgs> RunWorkerCompleted;
在以后的某些地方,我会将这两个事件处理程序分配给BackgroundWorker的实际事件。代码如下:
mBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler ( this.ProcessChanged );
mBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler ( this.RunWorkerCompleted );
但我不喜欢这种设计。因为componet的用户(这里是UI类)将其事件处理程序分配给组件的事件,并且它是实际操作,组件将向BackgroundWorker的事件处理程序添加(+ =)此事件处理程序。因此,如果UI一次又一次地运行,这将导致BackgroundWorker将具有多个相同的事件处理程序。我的想法是:1-BackgroundWorker的事件只能包含一个事件处理程序; 2 - 当用户将事件处理程序分配给组件核心自己的事件时,它可以同时将此事件处理程序传输到BackgroundWorker的事件;
任何人都可以给我一些可行的设计理念吗?谢谢!
答案 0 :(得分:0)
我找到了解决问题的解决方案。我可以使用add和remove关键字来定义我的组件核心类中的事件访问器。代码如下:
public virtual event ProgressChangedEventHandler ProcessChanged
{
add
{
lock ( mEventLock ) { mBackgroundWorker.ProgressChanged += value; }
}
remove
{
lock ( mEventLock ) { mBackgroundWorker.ProgressChanged -= value;}
}
}
所以这可以解决我的问题。用户分配到组件核心事件可以立即将事件分配给BackgroundWorker的相关事件。这就是我要的。所以在上面的问题中,代码的两部分可以集成到代码的一部分中。