事件 - 发布和订阅
Events - Publish & Subscribe
假设我有一个 class,其中有一个静态事件。此事件已被三个或更多不同的 class 订阅。 [假设 4]
现在,当值得注意的事情发生时,class 中的事件就会被引发。
由于4个不同的class订阅了事件,它们中对应的处理程序执行各自的代码。
现在,如果我不希望我的 class 的处理程序代码不执行 3 和 4。我需要做什么?
请帮忙。
提前致谢!
您希望处理程序在什么情况下触发?
您可以采用以下模式,该模式将提供一种机制来防止处理程序基于唯一标识符触发。
在这个例子中,我创建了一些简单的事件参数,事件将使用这些参数来告诉处理程序一个唯一标识符 (Guid):
public class MyEventArgs : EventArgs { public Guid Identifier { get; set; } }
然后,创建一个简单的 class 来引发事件:
public class EventGenerator
{
public EventHandler<MyEventArgs> TheEvent;
public void RaiseEvent(Guid identifier)
{
if (TheEvent != null)
TheEvent(this, new MyEventArgs(){Identifier = identifier});
}
}
最后,您可以拥有一个 class(任意数量),它们都将订阅该事件,但仅当事件参数提供不同的标识符时才会 运行 它:
public class TheClass
{
private readonly Guid _identifier;
private EventGenerator _eventGenerator;
// The constructor is given the event generator class instance
public TheClass(EventGenerator evGen)
{
// create a unique identifier for the class
_identifier = Guid.NewGuid();
// subscribe to the event
_eventGenerator = evGen;
_eventGenerator.TheEvent += TheEvent;
}
private void TheEvent(object sender, MyEventArgs e)
{
// when the event fires, check the Guid and if it isn't a match, don't continue ...
if (e.Identifier == _identifier) return;
// rest of the handler goes here ...
}
}
不过,这只是一个示例 - 您可能需要一些不同的东西,只需在选择的时间取消订阅活动即可实现。这取决于我最初问题的答案。
假设我有一个 class,其中有一个静态事件。此事件已被三个或更多不同的 class 订阅。 [假设 4]
现在,当值得注意的事情发生时,class 中的事件就会被引发。
由于4个不同的class订阅了事件,它们中对应的处理程序执行各自的代码。
现在,如果我不希望我的 class 的处理程序代码不执行 3 和 4。我需要做什么?
请帮忙。 提前致谢!
您希望处理程序在什么情况下触发?
您可以采用以下模式,该模式将提供一种机制来防止处理程序基于唯一标识符触发。
在这个例子中,我创建了一些简单的事件参数,事件将使用这些参数来告诉处理程序一个唯一标识符 (Guid):
public class MyEventArgs : EventArgs { public Guid Identifier { get; set; } }
然后,创建一个简单的 class 来引发事件:
public class EventGenerator
{
public EventHandler<MyEventArgs> TheEvent;
public void RaiseEvent(Guid identifier)
{
if (TheEvent != null)
TheEvent(this, new MyEventArgs(){Identifier = identifier});
}
}
最后,您可以拥有一个 class(任意数量),它们都将订阅该事件,但仅当事件参数提供不同的标识符时才会 运行 它:
public class TheClass
{
private readonly Guid _identifier;
private EventGenerator _eventGenerator;
// The constructor is given the event generator class instance
public TheClass(EventGenerator evGen)
{
// create a unique identifier for the class
_identifier = Guid.NewGuid();
// subscribe to the event
_eventGenerator = evGen;
_eventGenerator.TheEvent += TheEvent;
}
private void TheEvent(object sender, MyEventArgs e)
{
// when the event fires, check the Guid and if it isn't a match, don't continue ...
if (e.Identifier == _identifier) return;
// rest of the handler goes here ...
}
}
不过,这只是一个示例 - 您可能需要一些不同的东西,只需在选择的时间取消订阅活动即可实现。这取决于我最初问题的答案。